Skip to content

Upload 上传

文件选择与上传组件,支持图片/视频选择、文件大小校验、上传进度、多文件管理等。

基础用法

vue
<script setup lang="ts">
import { ref } from 'vue';
const fileList = ref([]);
</script>

<template>
  <lk-upload v-model="fileList" />
</template>

限制最大数量

通过 maxCount 限制可上传的最大文件数量。

vue
<lk-upload v-model="fileList" :max-count="3" />

限制文件大小

通过 maxSize 限制单个文件的最大体积(单位 byte),超出时触发 oversize 事件。

vue
<script setup lang="ts">
const onOversize = file => {
  uni.showToast({ title: '文件超出 2MB 限制', icon: 'none' });
};
</script>

<template>
  <lk-upload v-model="fileList" :max-size="2 * 1024 * 1024" @oversize="onOversize" />
</template>

上传前校验

通过 beforeRead 钩子在选中文件后、加入列表前进行校验,返回 false 可阻止。

vue
<script setup lang="ts">
const beforeRead = file => {
  if (file.type === 'image/gif') {
    uni.showToast({ title: '请上传非 GIF 图片', icon: 'none' });
    return false;
  }
  return true;
};
</script>

<template>
  <lk-upload v-model="fileList" :before-read="beforeRead" />
</template>

删除前确认(lk-modal)

通过 beforeDelete 钩子配合 lk-modal 组件在删除前进行确认,替代原生 uni.showModal,体验与主题统一。

vue
<script setup lang="ts">
import { ref } from 'vue';

const fileList = ref([]);
const deleteModalVisible = ref(false);
const pendingFileName = ref('');
let _resolve = null;

const beforeDelete = (file, { index }) => {
  return new Promise(resolve => {
    pendingFileName.value = file.name;
    deleteModalVisible.value = true;
    _resolve = resolve;
  });
};

const onConfirm = () => {
  deleteModalVisible.value = false;
  _resolve?.(true);
};

const onCancel = () => {
  deleteModalVisible.value = false;
  _resolve?.(false);
};
</script>

<template>
  <lk-upload v-model="fileList" :before-delete="beforeDelete" />
  <lk-modal v-model="deleteModalVisible" title="删除确认" @confirm="onConfirm" @cancel="onCancel">
    <text>确定删除「{{ pendingFileName }}」吗?</text>
  </lk-modal>
</template>

自动上传

配置 action 后选择文件将自动上传到服务器,并展示进度。

vue
<lk-upload
  v-model="fileList"
  action="https://api.example.com/upload"
  :headers="{ Authorization: 'Bearer xxx' }"
  :data="{ folder: 'avatar' }"
  name="file"
  @success="onSuccess"
  @fail="onFail"
  @progress="onProgress"
/>

自定义上传函数

通过 customRequest 接入外部请求工具(如项目中的 Request 类),替代内置 uni.uploadFile

vue
<script setup lang="ts">
import { createRequest } from '@/uni_modules/lucky-ui/core/src';

const request = createRequest({ baseURL: 'https://api.example.com' });

const customRequest = ({ file, action, name, headers, data, onProgress, onSuccess, onFail }) => {
  request
    .upload({
      url: action,
      filePath: file.url,
      name,
      header: headers,
      formData: data,
      onProgress: res => onProgress(res.progress),
    })
    .then(res => onSuccess(res))
    .catch(err => onFail(err));
};
</script>

<template>
  <lk-upload v-model="fileList" action="/upload" :custom-request="customRequest" />
</template>

禁用状态

vue
<lk-upload v-model="fileList" disabled />

自定义上传按钮

通过 trigger 插槽自定义上传区域内容。

vue
<lk-upload v-model="fileList">
  <template #trigger>
    <lk-icon name="camera" size="48" />
    <text>拍照</text>
  </template>
</lk-upload>

推荐示例

1) 直接复用项目 Demo(推荐)

vue
<script setup lang="ts">
import UploadDemo from '@/components/demos/upload-demo.vue';
</script>

<template>
  <UploadDemo />
</template>

2) 在业务页中按需组合

vue
<template>
  <view class="page-demo">
    <lk-upload v-model="fileList" :max-count="6" :max-size="5 * 1024 * 1024" />
  </view>
</template>

API

Props

属性名说明类型默认值
v-model文件列表UploadFile[][]
action上传服务器地址,为空则不自动上传string''
headers上传请求 headerRecord<string, string>{}
data上传附带数据Record<string, any>{}
name上传文件字段名string'file'
accept接受的文件类型'image' | 'video' | 'all''image'
inputAcceptH5 端 input 的 accept 属性string'image/*'
multiple是否支持多选booleantrue
maxCount最大文件数量number9
maxSize单个文件最大体积(byte)number10485760 (10MB)
disabled是否禁用booleanfalse
previewSize预览图尺寸string | number'180rpx'
deletable是否可删除booleantrue
previewImage是否可预览大图booleantrue
showUpload是否展示上传按钮booleantrue
sizeType图片尺寸类型(小程序)string[]['original','compressed']
sourceType文件来源(小程序)string[]['album','camera']
uploadText上传按钮文字string'上传'
uploadIcon上传按钮图标string'plus'
beforeRead选中文件前的钩子(file, detail) => boolean | Promise<boolean>
afterRead选中文件后的回调(file, detail) => void
beforeDelete删除前的钩子(file, detail) => boolean | Promise<boolean>
customRequest自定义上传函数(替代内置上传)CustomRequestFn
autoRemoveFail是否自动移除上传失败的文件booleanfalse
imageFit图片填充模式string'aspectFill'

UploadFile 数据结构

字段说明类型
uid唯一标识string
name文件名string
size文件大小 (字节)number
type文件类型 (MIME)string
url预览地址string
thumb缩略图地址string
status上传状态'ready' | 'uploading' | 'success' | 'fail'
progress上传进度 0-100number
message提示信息string
response服务端响应数据any

Events

事件名说明回调参数
update:modelValue文件列表变化,支持 v-model(fileList: UploadFile[])
change文件列表变化(fileList: UploadFile[])
afterRead文件读取完毕(file: UploadFile | UploadFile[], { index })
oversize文件超出大小限制(file: UploadFile | UploadFile[])
overcount文件数量超出限制({ maxCount, currentCount })
delete删除文件(file: UploadFile, { index })
clear清空文件()
clickPreview点击预览(file: UploadFile, { index })
clickUpload点击上传区域(event)
retry点击失败遮罩重新上传前触发(file: UploadFile, { index })
progress上传进度(file: UploadFile, { progress })
success上传成功(file: UploadFile, { response })
fail上传失败(file: UploadFile, { error })

Slots

插槽名说明
trigger自定义上传按钮内容

Methods(通过 ref 调用)

方法名说明参数
chooseFile手动触发文件选择
retryUpload重新上传指定文件(index: number)
removeFile删除指定文件(直接删除)(index: number)
confirmRemove确认删除文件(弹出 lk-modal)(index: number)
clearFiles清空所有文件

基于 MIT 协议开源 · 粤ICP备2022114240号-3

Upload 上传

正在连接预览服务...

请先运行 pnpm run dev:h5