Skip to content

Upload 上传

用于图片上传,支持多种上传模式和自定义上传接口。

基础用法

通过 custom-upload 传入自定义上传函数。

vue
<template>
  <dr-upload
    v-model="urls"
    :custom-upload="uploadFn"
    :max-count="3"
  />
</template>

<script setup>
import { ref } from 'vue'

const urls = ref('')

// 自定义上传函数,返回上传后的 URL
const uploadFn = async (file) => {
  const formData = new FormData()
  formData.append('file', file.path)
  const res = await fetch('/api/upload', {
    method: 'POST',
    body: formData
  })
  const data = await res.json()
  return data.url
}
</script>

使用上传接口

通过 upload-urlheaders 配置上传接口。

vue
<template>
  <dr-upload
    v-model="urls"
    upload-url="https://api.example.com/upload"
    :headers="{ Authorization: 'Bearer token' }"
    :form-data="{ dir: 'images' }"
    :parse-response="parseResponse"
  />
</template>

<script setup>
// 自定义响应解析函数
const parseResponse = (data) => {
  if (data.code === 200) {
    return data.url
  }
  return null
}
</script>

单图上传

设置 mode="single" 只上传一张图片。

vue
<dr-upload
  v-model="url"
  mode="single"
  :custom-upload="uploadFn"
/>

证件照上传

设置 mode="replace" 用于证件照等固定位置上传。

vue
<template>
  <dr-upload
    v-model="cardUrls"
    mode="replace"
    :custom-upload="uploadFn"
    :replace-placeholders="placeholders"
  />
</template>

<script setup>
const placeholders = [
  { text: '身份证正面' },
  { text: '身份证反面' }
]
</script>

显示上传进度

设置 show-progress 显示上传进度。

vue
<dr-upload
  v-model="urls"
  :custom-upload="uploadFn"
  show-progress
/>

限制文件大小

通过 max-size 限制文件大小(单位:字节)。

vue
<dr-upload
  v-model="urls"
  :custom-upload="uploadFn"
  :max-size="5 * 1024 * 1024"
  @oversize="onOversize"
/>

<script setup>
const onOversize = (files) => {
  uni.showToast({ title: '文件不能超过5MB', icon: 'none' })
}
</script>

禁用状态

vue
<dr-upload
  v-model="urls"
  disabled
/>

自定义上传按钮

通过 trigger 插槽自定义上传按钮。

vue
<dr-upload v-model="urls" :custom-upload="uploadFn">
  <template #trigger>
    <view class="custom-btn">
      <text>📷 点击上传</text>
    </view>
  </template>
</dr-upload>

API

Props

参数说明类型默认值
v-model已上传文件 URL,多个用逗号分隔string''
mode上传模式:append single replacestringappend
max-count最大上传数量number9
multiple单次最多选择数量number9
show-upload-btn是否显示上传按钮booleantrue
deletable是否可删除booleantrue
disabled是否禁用booleanfalse
upload-text上传按钮文字string上传图片
image-mode图片显示模式stringaspectFill
show-progress是否显示上传进度booleanfalse
previewable是否可预览图片booleantrue
source-type图片来源array['album', 'camera']
size-type图片尺寸类型array['original', 'compressed']
max-size最大文件大小(字节),0 不限制number0
replace-placeholdersreplace 模式占位配置array[{text:'正面'},{text:'反面'}]

上传配置 Props

参数说明类型默认值
upload-url上传接口地址string''
headers请求头object{}
name上传文件字段名stringfile
form-data上传附带的额外参数object{}
custom-upload自定义上传函数functionnull
parse-response自定义响应解析函数functionnull

custom-upload 函数签名

typescript
type CustomUpload = (file: {
  path: string    // 文件临时路径
  size: number    // 文件大小
}) => Promise<string>  // 返回上传后的 URL

parse-response 函数签名

typescript
type ParseResponse = (response: any) => string | null
// 返回 URL 字符串,解析失败返回 null

Events

事件名说明回调参数
change文件列表变化时触发fileList: object[]
success上传成功时触发{ url: string, file: object }
fail上传失败时触发{ error: Error, file: object }
delete删除文件时触发{ index: number, file: object }
preview预览图片时触发{ index: number, urls: string[] }
oversize文件超出大小限制时触发files: object[]

Slots

名称说明
trigger自定义上传按钮

Methods

方法名说明参数
getFileList获取文件列表-
getUrls获取 URL 数组-
clear清空文件-
chooseFile手动触发选择文件-

基于 MIT 许可发布