基本步骤

  通过 antd 框架的 Upload 控件,采用手动上传的方式,先选择需要上传的文件(控制文件数量以及大小),再根据所选的文件列表,循环上传,期间通过 Spin 控件提示上传中。

效果展示

  

控件引用

  Upload 控件配置:

 1 props : {
2 multiple: true,
3 maxCount:20,//限制最多显示 20 个文件
4 onRemove: (file) => {//删除列表文件
5 let fileListbatch_curr=this.state.fileListbatch;
6 console.log("props-onRemove-fileListbatch_curr:",fileListbatch_curr);
7 let index = fileListbatch_curr.findIndex(item=>item.uid==file.uid);
8 console.log("props-onRemove-obj:",index,file.uid);
9 if(index==-1){
10 //message.warning("未删除成功!")
11 return;
12 }else{
13 const newFileList = fileListbatch_curr.slice();
14 newFileList.splice(index, 1);
15 console.log("props-onRemove-newFileList:",newFileList);
16 this.setState({fileListbatch:newFileList});
17 let uploadsuccesslist_curr=this.state.uploadsuccesslist;
18 let indexsuccess=uploadsuccesslist_curr.findIndex(item=>item.uid==file.uid);//根据唯一码 uid 查找目标文件的索引
19 if(indexsuccess!=-1){
20 uploadsuccesslist_curr.splice(indexsuccess, 1);//删除
21 console.log("props-onRemove-uploadsuccesslist_curr:",uploadsuccesslist_curr);
22 this.setState({uploadsuccesslist:uploadsuccesslist_curr});
23 }
24 }
25 },
26 beforeUpload: (file) => {//添加文件,将文件加入临时列表,准备上传
27 let fileListbatch_curr=this.state.fileListbatch;
28 let ff=fileListbatch_curr.find((item)=>item.name==file.name);
29 if(ff==undefined){
30 fileListbatch_curr.push(file);
31 this.setState({fileListbatch:fileListbatch_curr,uploadflag:false});
32 return false;
33 }
34 else{
35 message.warning("存在同名文件已选择,请确认!");
36 return Upload.LIST_IGNORE;//列表中不显示
37 }
38 },
39 fileListbatch_cc,
40 }

  界面元素排列:

 1 <Upload {...props}>
2 <Button icon={<UploadOutlined />}>选择文件(Max:20Pcs, Max:200MB)</Button>
3 </Upload>
4 <Button
5 type="primary"
6 onClick={this.batchUploadReports}
7 disabled={fileListbatch.length === 0}
8 //loading={uploading}
9 style={{ marginTop: 20,width:180 }}
10 >
11 {/* {uploading ? 'Uploading' : 'Start Upload'} */}
12 开始上传
13 </Button>
14 <label style={{ lineHeight: "0px", color: '#bfbfbf', fontSize: 10,float:'left',marginBottom:20 }}>支持扩展名:apk/exe/pdf/xls/doc/ppt等</label>

处理逻辑

  根据文件列表,循环上传全部文件。

  【后端采用 .Net 5.0 WebAPI 详见:大文件分片上传 中的“后端部分”】

  1 //批量上传文件
2 batchUploadReports = () => {
3 this.setState({uploadsuccesslist:[]})
4 let uploadsuccesslist_curr=[];
5 this.formRef_upload.current.validateFields()
6 .then(formrefcurr => {
7 if(formrefcurr["baogaolb"]==0||formrefcurr["baogaolx"].length==0){
8 message.warning("请检查必填项!");
9 return null;
10 }
11 this.setState({fileuploading:true,uploadsuccesslist:[],tipContent:"报告文件上传中,请耐心等待..."});
12 let fileListbatch_curr2=this.state.fileListbatch;
13 let filecount=fileListbatch_curr2.length;
14 let filecount_success=0;
15 if(filecount>20){//只取前 20 个文件
16 filecount=20;
17 fileListbatch_curr2=fileListbatch_curr2.splice(0,20);
18 }
19 try{//通过抛出异常,来中断 foreach
20 fileListbatch_curr2.forEach(element => {//文件 list 循环上传
21 if(element.size/(1024*1024)>200){
22 this.setState({fileuploading:false,uploadsuccesslist:[],tipContent:"报告文件上传中,请耐心等待..."})
23 message.warning("单个报告大小不允许超过 200MB,请检查后继续上传!");
24 // fileListbatch_curr2.length=0;
25 throw new Error(element)//若有不符合条件的文件,抛出异常中断循环
26 }
27 else{
28 let filename=element.name;
29 let chunklistcurr=this.createFileChunk(element).map(({ file, name }, index) => {//createFileChunk:创建文件切片,可处理大文件
30 return {
31 chunk: file,
32 size: file.size,
33 percent: 0,
34 //filename:file.
35 name: name,// + "-" + (index + 1),
36 index,
37 };
38 });
39 let filecountchunk=chunklistcurr.length;
40 let ii=0;
41 chunklistcurr.forEach(element => {//分片传输
42 const formData = new FormData()
43 formData.append('file', element.chunk);
44 formData.append('index', element.index);
45 formData.append('name', element.name);
46 formData.append('size', element.size);
47 //formData.append('filecount', filecount);
48 axios({
49 method: 'post',
50 url: '/api/system/System/UploadFileAttachmentChunk?zhuti='+this.state.zhuti,
51 data: formData,
52 headers: { "Content-Type": "multipart/form-data"}
53 }).then(({data}) => {
54 if(data.code==200){
55 ii++;
56 if(ii==filecountchunk){//分块全部上传完成
57 let indata={"name":chunklistcurr[0].name,"filecount":filecountchunk,"filename":filename
58 }
59 axios({//传输完成,通知拼接
60 method: 'post',
61 url: '/api/system/System/CombineChunkToFileBatch',
62 data: indata,
63 headers: { "Content-Type": "application/json"}
64 }).then(({data}) => {
65 if(data.code==200){
66 let listbatchupload={}
67 uploadsuccesslist_curr.push(listbatchupload);
68 this.setState({uploadsuccesslist:uploadsuccesslist_curr});
69 filecount_success++;
70 }
71 else if(data.code==202){
72 window.location.href="/wellcome";
73 }
74 else{
75 message.error("上传失败,请稍后重试!详情:"+data.desc);
76 filecount_success++;
77 }
78 }).catch((err) =>{
79 console.log(err);
80 message.error("上传失败,请稍后重试!");
81 }).finally(() =>{
82 if(filecount_success==filecount){
83 this.setState({uploadflag:true})
84 message.success("全部上传完成,请进一步确认上传是否全部成功");
85 this.setState({fileuploading:false,tipContent:"加载中..."});
86 }
87 })
88 }
89 }
90 else if(data.code==202){
91 window.location.href="/wellcome";
92 }
93 else{
94 message.error("上传失败,请稍后重试!详情:"+data.desc);
95 chunklistcurr.length=0;
96 return;
97 }
98 }).catch((err) =>{
99 console.log(err);
100 message.error("上传失败,请稍后重试!");
101 return;
102 }).finally(() =>{ })
103 })
104 }
105 });
106 }
107 catch(e){
108 console.log('catch-e:'+e)
109 }
110 })
111 }
 1 //创建文件切片
2 createFileChunk = (file, size = 20*1024*1024) => {
3 const fileChunkList = [];
4 let cur = 0;
5 while (cur < file.size) {
6 fileChunkList.push({ file: file.slice(cur, cur + size), name: file.uid });//uid:文件唯一标识
7 cur += size;
8 }
9 return fileChunkList;
10 };

 注:本文代码已在项目中实用,有疑问欢迎指正。

antd 批量上传文件逻辑的更多相关文章

  1. 不带插件 ,自己写js,实现批量上传文件及进度显示

    今天接受项目中要完成文件批量上传文件而且还要显示上传进度,一开始觉得这个应该不是很麻烦,当我在做的时候遇到了很多问题,很头疼啊. 不过看了别人写的代码,自己也测试过,发现网上好多都存在一些问题,并不是 ...

  2. Linux命令之rz - 批量上传文件,简单易用(转载)

    用途说明 rz命令能够批量上传文件,当然也可上传单个文件啦.使用的协议是古老的ZMODEM协议,尽管协议古老,但毫不影响的简单易用的特性.一般情 况我们要上传文件到Linux系统,要么使用ftp(还得 ...

  3. 转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

    请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Andr ...

  4. Python基于Python实现批量上传文件或目录到不同的Linux服务器

    基于Python实现批量上传文件或目录到不同的Linux服务器   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...

  5. input file multiple 批量上传文件

    这几天维护系统,有一个批量上传文件功能,出现了一点小问题 我的笔记本选择要上传的文件很正常 但在测试环境上,别人的电脑上,选择上传文件之后 一开始,以为是代码问题,网上找了很多的资料,但还是没用,然后 ...

  6. 使用 sendKeys(keysToSend) 批量上传文件

    未经允许,禁止转载!!! 在selenium里面处理文件上传的时候可以使用sendKeys(keysToSend) 上传文件 例如: element.sendKeys(“C:\\test\\uploa ...

  7. TP3.2批量上传文件(图片),解决同名冲突问题

    1.html <form action="{:U('Upload/index')}" enctype="multipart/form-data" meth ...

  8. 用Azure CLI批量上传文件

    在Windows环境下,我们可以使用AzCopy批量上传文件.其效率和传输速率都是非常快的. 在Linux或MacOS环境下,可以使用Azure的CLI实现批量文件的上传. 下面的脚本可以实现此功能. ...

  9. Java Miniui实现批量上传文件demo 201906221520

    可能需要的jar包: 需要miniui(类似easyui). Test2019062201.jsp <%@ page language="java" contentType= ...

随机推荐

  1. Apache DolphinScheduler 迎来 2 位 PPMC

    经过 Apache DolphinScheduler PPMC 们的推荐和投票,我们高兴的宣布:Apache DolphinScheduler 迎来了 2 位 PPMC .他们是(github id) ...

  2. Webstorm设置背景图为Windows桌面背景

    桌面背景图会缓存在这个目录中,文件名不确定在改变桌面背景后会不会变. C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles ...

  3. 杀死 Windows 某个端口

    进入终端命令行,输入netstat -aon|findstr 3000查找端口号所对应的 PID: 输入指令taskkill /pid 20348 /f:

  4. LOJ6029「雅礼集训 2017 Day1」市场 (线段树)

    题面 从前有一个学校,在 O n e I n D a r k \rm OneInDark OneInDark 到任之前风气都是非常良好的,自从他来了之后,发布了一系列奇怪的要求,挟制了整个学校,导致风 ...

  5. HTML短链接

    短链接跳转方法 新建一个目录名称就是短链接字符列如:1 创建一个index.html文件里面添加代码如下 <script type="text/javascript"> ...

  6. 【Manim CE】常用Mobject

    当前文档版本:v0.16.0.post0 VMobject 继承自Mobject V的意思是向量化的,vectorized mobject fill_color=None, fill_opacity= ...

  7. RabbitMQ之消息模式简单易懂,超详细分享~~~

    前言 上一篇对RabbitMQ的流程和相关的理论进行初步的概述,如果小伙伴之前对消息队列不是很了解,那么在看理论时会有些困惑,这里以消息模式为切入点,结合理论细节和代码实践的方式一起来学习. 正文 常 ...

  8. TDengine概述以及架构模型

    TDengine TDengine是一个高效的存储.查询.分析时序大数据的平台,专为物联网.车联网.工业互联网.运维监测等优化而设计. 您可以像使用关系型数据库MySQL一样来使用它. TDengin ...

  9. 容器化|自建 MySQL 集群迁移到 Kubernetes

    背景 如果你有自建的 MySQL 集群,并且已经感受到了云原生的春风拂面,想将数据迁移到 Kubernetes 上,那么这篇文章可以给你一些思路. 文中将自建 MySQL 集群数据,在线迁移到 Kub ...

  10. golang 实现笛卡尔积(泛型)

    背景 input: [[a,b],[c],[d,e]] output: [[a,c,d],[a,c,e],[b,c,d],[b,c,e]] 思路:分治 预处理第一项:[a,b] -> [[a], ...