.Net Core常见的文件下载功能和文件上传功能

2021-05-13

.Net Core常见的文件下载功能和文件上传功能、大文件分片上传

下载功能

Get请求,直接发送get请求(浏览器访问)即可下载文件

post请求,后台返回流数据,前端处理再通过点击隐藏链接,达到下载效果。

前端请求

GetPost下载

上传文件

单文件上传

formData.append("formFile", file[0]) //单个

formData的键(formFile)要和方法的参数名(formFile)一致

image-20210513152612253

单文件上传——表单方式

多文件上传

前端formData.append("aaaa", files[i]) 此处的key(即aaaa)是可以随便设置的

前端提交的区域不是Form表单时,后台不可以直接通过 IFormFileCollection 来获取前端提交的文件而是通过Request.Form.Files

image-20210513154011079

多文件上传——表单形式

前端Form表单形式上传可以通过IFormFileCollection和Request.Form.Files来获取客户端传过来的文件,多文件上传标签input的name值(formFiles)必须和后端方法的参数名(formFiles)一致,否则IFormFileCollection无法正常获取文件

image-20210513155054980

model组合上传(多文件、单文件、文本信息)

红线为无法正常解析。

Request.Form.Files可获取到前端传过来的所有文件,我们可以通过Name来区分是单文件还是多文件即区分该文件是属于哪一类数据

前端提交数据示例,如下图

image-20210513162116106

后端获取的数据,如下图

image-20210513161609444

model组合上传(多文件、单文件、文本信息)——表单形式

image-20210513164856422

image-20210513163802327

大文件分片上传

DisableFormValueModelBinding过滤器

FileChunk

FileSort

大文件上传参考博客:.NET Core Web APi大文件分片上传研究 - Jeffcky - 博客园 (cnblogs.com)

UploadChunkAsync报错:Unexpected end of Stream, the content may have already been read by another component.

解决方法:UploadChunkAsync方法加个DisableFormValueModelBinding特性

思路整理:

1.客户端对大文件切割成多分

2.客户端将每一份数据上传到服务器

3.服务器将上传的分片数据保存到硬盘

4.所有分片数据上传完成后,按照先后进行排序(通常是在上传的文件名标序号)

5.按照先后顺序合并成一个文件,得到目标文件

6.删除上述的分片文件

分片上传流程

 

MultipartReader和IFormFile(IFormFileCollection)

参考博客:NetCore3.0 文件上传与大文件上传的限制 - 一身大膘 - 博客园 (cnblogs.com)

IFormFile:缓冲,通过模型将整个文件读到内存,后续通过IFormFile可以直接得到stream,优点是效率高,使用起来简单方便,缺点是对内存要求大,处理大文件效果差。

整个文件读取到IFormFile,文件上传所用的资源(磁盘、内存)取决于并发文件上传的数量和大小,如果文件上传的大小或频率会消耗应用资源,请使用流式传输.

MultipartReader:流式处理,直接读取请求体装载后的section对应的stream,后续直接操作stream即可,无需将整个请求体读入内存。

从多部份请求收到文件,流式传输无法显著提高性能(可通过异步来实现),可降低上传文件时对内存或磁盘空间的需求。

项目代码:logerlink/NetCoreDownloadFileDemo: .NetCore常见的文件下载功能和文件上传功能、大文件分片上传 (github.com)