Skip to content

Upload

Image, video and file upload component.

Tip

Currently, all platforms compatible with the component library support video upload. Video covers implemented using the video component are supported on H5, WeChat Mini Program and Alipay Mini Program platforms, while DingTalk Mini Program and App platforms are limited by the video tag capability and cannot directly serve as video covers. It is recommended to get the video cover in the change event and supplement the thumb field for the corresponding video in fileList.

About WeChat Mini Program Privacy Agreement

upload uses three privacy interfaces on the WeChat Mini Program platform: wx.chooseImage, wx.chooseMedia, wx.chooseVideo. It needs to be configured according to the WeChat privacy agreement, otherwise the upload capability will be unavailable. Please refer to Mini Program Privacy Agreement Development Guide.

Component Types

Basic Usage

Set the upload list through file-list or v-model:file-list, and specify the upload address through action.

html
<wd-upload v-model:file-list="fileList" accept="image" image-mode="aspectFill" :action="action" :success-status="[200, 201]"></wd-upload>
ts
import { ref } from 'vue'
import type { UploadFile } from '@/uni_modules/wot-ui/components/wd-upload/types'

const action = 'https://69bd04402bc2a25b22ad0a49.mockapi.io/upload'

const fileList = ref<UploadFile[]>([
  {
    url: 'https://wot-ui.cn/assets/panda.jpg'
  }
])

Upload Video

After setting accept to video, you can upload video files.

html
<wd-upload accept="video" multiple :file-list="fileList" :action="action" :success-status="[200, 201]" @change="handleChange"></wd-upload>

Upload Media and Files

accept="media" supports images and videos, accept="file" supports regular files, accept="all" supports all file types. Different platforms have different support ranges, see the accept valid values description below.

html
<wd-upload accept="all" multiple :file-list="fileList" :action="action" :success-status="[200, 201]" @change="handleChange"></wd-upload>

Component States

Upload Status Hooks

Upload status feedback can be displayed through success, fail and progress events.

html
<wd-upload
  :file-list="fileList"
  :action="action"
  :success-status="[200, 201]"
  @change="handleChange"
  @success="handleSuccess"
  @fail="handleFail"
  @progress="handleProgress"
></wd-upload>

Disabled

html
<wd-upload :file-list="fileList" disabled :action="action" :success-status="[200, 201]" @change="handleChange"></wd-upload>

Manual Trigger Upload

After setting auto-upload="false", you can manually start upload through the component instance's submit method.

html
<wd-upload
  ref="uploadRef"
  :auto-upload="false"
  :file-list="fileList"
  :action="action"
  :success-status="[200, 201]"
  @change="handleChange"
></wd-upload>

<wd-button @click="uploadRef?.submit()">Start Upload</wd-button>
ts
import { ref } from 'vue'
import type { UploadFile, UploadInstance } from '@/uni_modules/wot-ui/components/wd-upload/types'

const uploadRef = ref<UploadInstance>()
const fileList = ref<UploadFile[]>([])

Component Variants

Maximum Upload Limit

Limit the maximum number of files through limit.

html
<wd-upload :file-list="fileList" :limit="3" :action="action" :success-status="[200, 201]" @change="handleChange"></wd-upload>

Overwrite Upload

After setting reupload, re-selecting files will replace the previous item, suitable for single file overwrite scenarios like avatars.

html
<wd-upload reupload v-model:file-list="fileList" accept="image" image-mode="aspectFill" :action="action" :success-status="[200, 201]"></wd-upload>

Multiple Selection

html
<wd-upload :file-list="fileList" multiple :action="action" :success-status="[200, 201]" @change="handleChange"></wd-upload>

Component Styles

Custom Evoke Style

The default upload evoke area can be replaced through the default slot.

html
<wd-upload :file-list="fileList" :limit="5" :action="action" :success-status="[200, 201]" @change="handleChange">
  <wd-button>Custom Evoke Style</wd-button>
</wd-upload>

Custom Preview Style

Content that covers the preview area can be customized through the preview-cover slot.

html
<wd-upload v-model:file-list="fileList" accept="image" image-mode="aspectFill" :action="action" :success-status="[200, 201]">
  <template #preview-cover="{ file, index }">
    <view class="preview-cover">{{ file.name || `File${index}` }}</view>
  </template>
</wd-upload>
scss
.preview-cover {
  margin-top: 10rpx;
  text-align: center;
}

Special Styles

Intercept Preview Image Operation

before-preview is triggered before preview. Returning false or a Promise with value false can prevent preview.

html
<wd-upload :file-list="fileList" :action="action" :success-status="[200, 201]" @change="handleChange" :before-preview="beforePreview"></wd-upload>

Upload Pre-processing

before-upload is triggered after confirming file selection and before initiating upload.

html
<wd-upload :file-list="fileList" :action="action" :success-status="[200, 201]" @change="handleChange" :before-upload="beforeUpload"></wd-upload>

Remove Image Pre-processing

html
<wd-upload :file-list="fileList" :action="action" :success-status="[200, 201]" @change="handleChange" :before-remove="beforeRemove"></wd-upload>

Select File Pre-processing

html
<wd-upload :file-list="fileList" :action="action" :success-status="[200, 201]" @change="handleChange" :before-choose="beforeChoose"></wd-upload>

Custom Upload Method

Upload behavior can be completely taken over through upload-method.

html
<wd-upload v-model:file-list="fileList" :upload-method="customUpload" :success-status="[200, 201]"></wd-upload>
ts
import type { UploadMethod } from '@/uni_modules/wot-ui/components/wd-upload/types'

const customUpload: UploadMethod = (file, formData, options) => {
  const task = uni.uploadFile({
    url: options.action,
    name: options.name,
    filePath: file.url,
    formData,
    header: options.header,
    success: (response) => options.onSuccess(response, file, formData),
    fail: (error) => options.onError(error, file, formData)
  })

  task.onProgressUpdate((response) => {
    options.onProgress(response, file)
  })

  return task
}

Filter by File Extension

After setting extension, you can limit the suffix of selected files. H5 supports all type filtering, WeChat Mini Program supports all and file scenario filtering.

html
<wd-upload v-model:file-list="fileList" :extension="['.jpg', '.png']" :action="action" :success-status="[200, 201]"></wd-upload>

Business Capabilities

Upload to Cloud Storage

build-form-data is used to dynamically build signature fields before actual upload, suitable for connecting to OSS, COS, OBS and other cloud storage services.

html
<wd-upload :file-list="files" :action="host" :build-form-data="buildFormData" @change="handleChange"></wd-upload>
ts
const host = 'https://examplebucket.oss-cn-zhangjiakou.aliyuncs.com'

function buildFormData({ file, formData }) {
  const imageName = file.url.substring(file.url.lastIndexOf('/') + 1)

  return {
    ...formData,
    key: `20231120/${imageName}`,
    OSSAccessKeyId: 'your-access-key',
    policy: 'your-policy',
    signature: 'your-signature',
    success_action_status: '200'
  }
}

Upload Attributes

ParameterDescriptionTypeDefault Value
file-list / v-model:file-listUpload file list, for example [{ url: 'https://xxx.cdn.com/xxx.jpg' }]UploadFile[][]
actionUpload addressstring''
headerUpload request headerRecord<string, any>{}
multipleWhether to support multiple file selectionbooleanfalse
disabledWhether disabledbooleanfalse
limitMaximum allowed upload countnumber-
show-limit-numWhen limiting upload quantity, whether to show current quantitybooleantrue
max-sizeFile size limit, in bytesnumberNumber.MAX_VALUE
source-typeSelect image sourceUploadSourceType[]['album', 'camera']
size-typeSelected image sizeUploadSizeType[]['original', 'compressed']
nameUpload file field namestringfile
form-dataAdditional form data attached to HTTP requestRecord<string, any>{}
on-preview-failPreview failure callbackUploadOnPreviewFail-
before-uploadUpload pre-hookUploadBeforeUpload-
before-chooseSelect file pre-hookUploadBeforeChoose-
before-removeDelete file pre-hookUploadBeforeRemove-
before-previewImage preview pre-hookUploadBeforePreview-
build-form-dataHook for dynamically building upload formDataUploadBuildFormData-
loading-typeLoading icon typeLoadingTypecircular
loading-colorLoading icon colorstring#ffffff
loading-sizeLoading icon sizestring24px
acceptAccepted file types, optional values are image, video, media, all, fileUploadFileTypeimage
status-keyThe key corresponding to the status field in file data structurestringstatus
compressedWhether to compress video, effective when accept is video or mediabooleantrue
max-durationMaximum video recording duration, in secondsnumber60
cameraUse front or back camera, optional values are front, backUploadCameraTypeback
image-modemode property for preview imageImageModeaspectFit
success-statusInterface response success status codenumber | number[]200
custom-evoke-classCustom upload button style classstring''
custom-preview-classCustom preview list style classstring''
auto-uploadWhether to auto-upload after selecting files, needs to manually call submit when closedbooleantrue
reuploadWhether to enable overwrite upload, will close image preview when enabledbooleanfalse
upload-methodCustom upload methodUploadMethod-
extensionFilter by file extension, H5 supports all type filtering, WeChat Mini Program supports all and file scenario filteringstring[]-
custom-classRoot node custom style classstring''
custom-styleRoot node custom stylestring''

accept Valid Values

ParameterDescriptionTypeDefault Value
imageImage, supported on all platforms, WeChat Mini Program uses chooseMedia implementationUploadFileType-
videoVideo, supported on all platforms, WeChat Mini Program uses chooseMedia implementationUploadFileType-
mediaImage and video, only supported on WeChat Mini Program, uses chooseMedia implementationUploadFileType-
fileRegular file, only supported on WeChat Mini Program, uses chooseMessageFile implementationUploadFileType-
allAll file types, only supported on WeChat Mini Program and H5UploadFileType-

file Data Structure

ParameterDescriptionTypeDefault Value
uidUnique identifier of current upload file in the listnumber-
thumbThumbnail addressstring-
nameCurrent file namestring-
statusCurrent file upload status, optional values are pending, loading, success, failUploadStatusType-
sizeFile sizenumber-
urlFile addressstring-
percentUpload progressnumber-
responseBackend returned content, may be string or objectstring | Record<string, any>-

Upload Slots

NameDescription
defaultCustom upload evoke area
preview-coverCustom content covering above the preview area, parameters are { file, index }

Upload Events

Event NameDescriptionParameters
successTriggered when upload succeedsUploadSuccessEvent
failTriggered when upload failsUploadErrorEvent
progressTriggered during uploadUploadProgressEvent
oversizeTriggered when file size exceeds limitUploadOversizeEvent
chooseerrorTriggered when file selection failsany
changeTriggered when upload list changesUploadChangeEvent
removeTriggered when file is removedUploadRemoveEvent
update:fileListUpdate event corresponding to v-model:file-listUploadFileItem[]

Upload Methods

Method NameDescriptionParameters
submitManually start upload-
abortCancel upload(task?: UniApp.UploadTask) => void

主题定制

CSS 变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 全局配置

名称默认值描述
--wot-upload-size$n-88上传项尺寸
--wot-upload-radiusvar(--wot-upload-border-radius, $radius-main)上传项圆角
--wot-upload-border-color$border-main上传项边框颜色
--wot-upload-evoke-icon-size$n-32唤起项的图标大小
--wot-upload-evoke-bg$filled-bottom唤起项背景色
--wot-upload-evoke-color$text-auxiliary唤起项文字颜色
--wot-upload-evoke-font-size$typography-body-size-main唤起项文字大小
--wot-upload-evoke-line-height$typography-body-line-height-size-main唤起项文字行高
--wot-upload-evoke-color-disabled$text-disabled唤起项禁用文字颜色
--wot-upload-evoke-icon-color$icon-auxiliary唤起项图标颜色
--wot-upload-evoke-icon-color-disabled$icon-disabled唤起项禁用图标颜色
--wot-upload-close-padding$padding-ultra-tight关闭按钮内边距
--wot-upload-close-radiusvar(--wot-upload-close-border-radius, $radius-zero $radius-zero $radius-zero $radius-main)关闭按钮圆角
--wot-upload-close-bg$opacfilled-main-cover关闭按钮背景色
--wot-upload-close-icon-size$n-16关闭按钮图标尺寸
--wot-upload-close-icon-color$icon-white关闭按钮图标颜色
--wot-upload-progress-font-size$typography-body-size-main进度文字字号
--wot-upload-progress-line-height$typography-body-line-height-size-main进度文字行高
--wot-upload-progress-color$text-white进度文字颜色
--wot-upload-file-font-size$typography-label-size-main文件名文字字号
--wot-upload-file-line-height$typography-label-line-height-size-main文件名文字行高
--wot-upload-file-color$text-secondary文件名文字颜色
--wot-upload-file-padding$padding-zero $padding-tight文件/视频名称内边距
--wot-upload-preview-icon-size$n-24预览态内部图标尺寸
--wot-upload-preview-icon-color$icon-white预览态内部图标颜色
--wot-upload-preview-margin$spacing-zero $spacing-tight $spacing-tight $spacing-zero预览项外边距
--wot-upload-cover-icon-size$n-24视频/文件图标尺寸
--wot-upload-video-icon-size$n-24视频图标尺寸
--wot-upload-video-icon-color$icon-white视频播放图标颜色
--wot-upload-mask-bg$opacfilled-main-cover遮罩层背景色
--wot-upload-row-spacing$spacing-tight上传项行间距

Source Code

Documentation
Component

Released under the MIT License.

Released under the MIT License.