Skip to content

文件上传

Upload 管理文件选择、大小校验、上传、删除、下载和只读预览,并可把等待中的上传任务接入 SuperForm 提交流程。先确定上传时机,再确定字段值形态。

五种 uploadMode

attrs.uploadMode行为适合场景
auto选择后立即调用 apis.upload,默认普通附件上传
submit选择时暂存,表单提交时统一上传希望保存按钮统一控制
custom不调用上传接口,保留原始 File导入 Excel、业务自行上传
base64FileReader 保存 Data URL小图片、本地预览
textFileReader 保存文本文本文件解析
ts
// 自动上传
{
  type: 'Upload',
  field: 'attachments',
  label: '附件',
  attrs: {
    uploadMode: 'auto',
    apis: { upload: api.upload },
  },
}

// 业务导入:提交时自行读取 File
{
  type: 'Upload',
  field: 'file',
  label: '导入文件',
  attrs: {
    uploadMode: 'custom',
    isSingle: true,
    accept: '.xlsx',
  },
}

autosubmit 必须提供当前字段 attrs.apis.upload,或全局 defaultProps.Upload.apis.upload

字段值形态

配置模型值
多文件,无 valueKey文件对象数组
isSingle: true单个文件对象
valueKey: 'fileId'fileId 数组
isSingle + valueKey单个 fileId
ts
{
  type: 'Upload',
  field: 'attachmentIds',
  vModelFields: {
    fileList: 'attachments',
  },
  attrs: {
    valueKey: 'fileId',
    infoNames: {
      uid: 'fileId',
      name: 'fileName',
      url: 'downloadUrl',
    },
  },
}

结果同时保留:

ts
{
  attachmentIds: ['f-1', 'f-2'],
  attachments: [
    { fileId: 'f-1', fileName: '合同.pdf', downloadUrl: '/file/f-1' },
  ],
}

vModelFields.fileList 可以是同级字段名,也可以直接传 Ref/对象;字符串映射最适合随表单一起提交。

apis 契约

ts
attrs: {
  apis: {
    upload(formData, { onUploadProgress }) {
      return http.upload('/files', formData, { onUploadProgress })
    },
    delete(file) {
      return api.deleteFile(file.fileId)
    },
    download(file) {
      return api.downloadFile(file.fileId)
    },
  },
}
接口参数与返回
uploadFormData 与进度回调;返回文件信息
delete当前业务文件对象;返回 Promise
download当前业务文件对象;返回可构造 Blob 的数据

上传结果会合并进当前文件项。删除接口收到的是按 infoNames 映射回业务字段名的对象。

infoNames 映射

组件内部需要 uidnameurl,业务接口可以使用自己的字段:

ts
infoNames: {
  uid: 'id',
  name: 'originalName',
  url: 'previewUrl',
}

映射只服务内部展示,对外模型仍保持业务字段名。未提供 url 时可以通过 apis.download 下载。

限制与提示属性

attrs 属性类型默认值说明
minSizenumber文件最小大小,单位 MB
maxSizenumber文件最大大小,单位 MB
isSinglebooleanfalse单文件模式,并限制最大数量为 1
hideOnMaxbooleanfalse达到 maxCount 后隐藏上传入口
repeatablebooleanfalse是否允许同名文件
tipstring自动生成上传区辅助提示
titlestring/function'上传文件'上传按钮内容
acceptstring扩展名或 MIME 类型
maxCountnumberInfinity最大文件数量
beforeUploadfunction业务前置校验
isViewbooleanfalse强制只读查看模式,通常由详情自动传入
ts
attrs: {
  accept: '.pdf,.doc,.docx',
  minSize: 0.01,
  maxSize: 20,
  maxCount: 5,
  hideOnMax: true,
  repeatable: false,
  tip: '最多 5 个文件,单个不超过 20MB',
  title: '选择附件',
}

底层 beforeUpload 返回非 undefined 时会影响内置选择流程;只有需要额外业务校验时配置,通用大小和重复校验优先使用专属属性。

提交时机与错误

  • auto 会等待仍在上传的任务,上传错误会阻止表单提交。
  • submit 在表单提交时启动等待文件,并延后处理待删除的远程文件。
  • custom 不注册远程上传,业务从 originFileObj 读取原始 File。
  • base64 / text 读取失败会保留错误状态。
ts
const modal = useModalForm(schema, {
  onOk: async ({ file }) => {
    const body = new FormData();
    body.append("file", file.originFileObj);
    return api.import(body);
  },
});

预览与只读

图片默认使用预览器。Ant Design Vue UploadProps 的 onPreview(file)isImageUrl(file)listTypeshowUploadList 等继续通过 attrs 使用。详情模式隐藏上传和删除入口、保留下载;无附件显示“暂无附件”。

不依赖后端的模式可在文件上传示例中运行。

基于 MIT 许可发布