antd 实现批量上传

简介: antd 实现批量上传

前言

多文件上传本质是循环存储的过程,只是在实现方式有所区别,

实现方式:

  • 前端批量上传:前端轮询调用后端单文件上传接口
  • 后端批量存储:一次性接收前端多文件,循环存储

组件 vs 定制化

antd中的upload组件功能强大,支持文件夹、拖拽、自动上传、ui美观,文档完善,通过简单配置即可开发完功能,以功能为主的开发,建议使用组件完成

如果定制化功能,业务交互复杂,建议手写上传功能,其本质将file类型的数据,以fomdata的格式发送给后端。

如实现多文件上传,建议搭配promise使用,promise.all() 可等待多个异步操性、结合此特性实现批量上传的效果。

示例代码

antd-upload自动上传

// 初始化 上传组件的列表数据
const [fileList, setFileList] = useState<UploadFile[]>([]);
// uoload 组件配置项
const props = {
    beforeUpload: (file: File) => {
      if (file.size > maxFileSize) {
        message.warning('文件最多上传1m')
        return Upload.LIST_IGNORE
      }
      // console.log(file, 'file')
      // const isPNG = file.type === 'image/png';
      // if (!isPNG) {
      //   message.error(`${file.name} is not a png file`);
      // }
      // return isPNG || Upload.LIST_IGNORE;
      // return true
    },
    action: 'http:///localhost:9981/upload_oss',/// 接口地址 oss or 本地
    onChange: handleChange,
    multiple: true,
  };
// upload 组件change事件
 const handleChange: UploadProps['onChange'] = (info) => {
    console.log('oonchang', info)
    let newFileList = [...info.fileList];
    newFileList = newFileList.map((file) => {
      if (file.response) {
        // Component will show file.url as link
        file.url = file.response.url;
      }
      return file;
    });
    setFileList(newFileList);
  };
// 支持拖拽的上传组件
<Dragger height={70}   {...props} fileList={fileList} listType="picture">
  <p>支持拖拽上传</p>
</Dragger>

antd-upload +promise.all 批量上传

  // 封装上传函数
  const uploadFiles = (file: any) => {
    console.log('file', file)
    const formData = new FormData()
    formData.append('file', file.originFileObj)
    return new Promise((resolve, rejects) => {
      request.post('/upload_oss', formData).then((response) => {
        resolve(response.data.imgUrl)
        message.success(`${file.name} 以上传成功`)
        console.log('startFileList', startFileList)
      }).catch((err) => {
        rejects(err)
      })
    })
  }
  // 提交上传
  const multipleUpload = async () => {
    const uploadPromiess = startFileList.map((file) => uploadFiles(file))
    let imgs = await Promise.all(uploadPromiess)
    console.log('全部上传成功', imgs)
  }
  // 上传组件chang事件 
  const handleChange1: UploadProps['onChange'] = (info) => {
    let newFileList = [...info.fileList]; 
    console.log('触发了')
    newFileList = newFileList.map((file) => {
        // Component will show file.url as link 
        try {
          // file 生成临时的url
          file.url = URL.createObjectURL(file.originFileObj as RcFile);
        } catch (error) {
        }
      return file;
    });
    console.log('oonchang', newFileList)
    // 更新
    setStrartFileList(newFileList);
  };
<Upload  {
  ...{
    multiple: true,
    maxCount: 10,
    fileList: startFileList,
    onRemove: (file) => {
      const index = startFileList.indexOf(file);
      const newFileList = startFileList.slice();
      newFileList.splice(index, 1);
      // setStrartFileList([]);
    },
    beforeUpload: (file: any) => {
      console.log('filelist', startFileList);
      // return Upload.LIST_IGNORE - 文件不进行回显
      // return false 关闭上传请求
      return false
    },
    listType: 'picture',
    onChange: handleChange1
  }
}>
</Upload>
  <Button >  选择文件</Button><br></br>  <div> <p> 以选中{startFileList.length}个文件,已上传</p></div>
    <Button onClick={multipleUpload}>提交</Button>
相关文章
|
6天前
|
JavaScript 索引 容器
vue实现多文件预览以及切换
vue实现多文件预览以及切换
40 0
|
6天前
|
存储
Vue3 实现 PDF 文件在线预览功能
Vue3 实现 PDF 文件在线预览功能
402 0
|
9月前
vue3 wangEditor富文本自定义上传本地图片
Vue3和WangEditor都提供了上传本地图片的功能,可以结合使用实现自定义上传本地图片。
644 0
|
前端开发
react-antd中使用Upload实现图片裁剪-上传-预览的功能
使用react中antd实现图片的上传裁剪和预览,记录一下实现过程,希望能对大家有帮助
817 0
react-antd中使用Upload实现图片裁剪-上传-预览的功能
|
JavaScript
【ElementUI】Vue+ElementUI多文件上传,一次请求上传多个文件!
教大家一次请求,上传多个文件。 ElementUI如果是默认方案,上传多张图片并不是真正的一次上传多张,而是发送多次请求,一次请求携带一张图片。
794 0
|
6天前
|
JavaScript 前端开发
vue 实现在线预览PDFpdf文件
vue 实现在线预览PDFpdf文件
33 0
|
6天前
|
JavaScript 前端开发 应用服务中间件
vue如何打包上传至服务器?
vue如何打包上传至服务器?
18 0
|
6天前
|
JavaScript 前端开发
vue3 导出excel表格
vue3 导出excel表格
|
7月前
|
JavaScript 前端开发 数据处理
vue中实现文件下载,导出Excel表格
vue中实现文件下载,导出Excel表格
68 2
|
9月前
|
资源调度 JavaScript 前端开发
Vue 3实现将二维码导出为pdf
Vue 3实现将二维码导出为pdf
148 1