前言

前两天发表利用formdata进行文件上传,然后有人问要是大文件几个g上传怎么搞,常见的不就是分片再搞下断点续传,动动手差不多也能搞出来,只不过要深入的话,考虑的东西还是很多。由于断点续传之前写个几篇,这里试试利用formdata来进行分片上传。

.net core web api文件分片上传

这里我们依然是使用formdata来上传,只不过在上传之前对文件进行分片处理,如下html代码

接下来则是上传脚本,如下:

简单来说只需实现上述uploadfile方法,对大文件进行分片处理,然后上传就完事,文件上传后大致如下图所示,最后只需将所有文件进行合并处理为目标文件即可

接下来我们详细讲讲如何实现,当然重点就在于如何进行分片处理,我们拿到上传目标文件,然后通过slice方法进行分片,在分片处理之前我们定义缓冲区大小(默认为8兆),然后循环遍历文件大小,然后将分片数据塞入分片数组,最后利用循环或者队列先进先出机制获取数组分片元素上传。

上述关于分片塞入数组就不用再废话,这里我们将每一片文件命名先进行一个约定(文件名+“.partnumber” + 分片号),以便所有分片上传完成后获取按照文件名中的分片号对其进行排序合并,这也就是合并文件的依据。接下来就是上传每一片文件

我们可以看到在url上额外加了其他参数,为什么要加上这些参数呢?主要为解决几个问题,其一:前端确认缓冲区大小,我们获取前端确认的缓冲区大小,这样后台不用写死,更加灵活,万一后续进行了修改,谁知道呢?其二:我们怎么确定文件是否已经全部上传完了呢?在url上我们添加分片总数和文件实际大小来完全确定文件已经全部上传和文件完整无缺。当然也额外添加了每一片读取的起始位置和结束位置,若有所需也可以利用。多余的就不用我再解释。接下来我们看看后台如何对每一片进行处理呢?在.net core中实际上提供了对应api来专门读取formdata数据,利用microsoft.aspnetcore.webutilities命名空间下的multipartreader类。

首先我们判断是否请求内容是否为formdata,同时通过上下文获取上述文件读取类的参数boundary,如下:

接下来我们定义分片类而获取url上每一片的参数,如下:

接下来在提交控制器方法上去读取每一片数据如下

然后就是循环每一片(section),若不为空说明还存有分片文件,然后读取url上的缓冲区大小,如下:

在利用内置api读取formdata数据时,在.net core 3.x会抛出如下异常:

大致原因出在.net core内置提供了对于参数的绑定和此方法读取貌似有点冲突导致,我们实现如下特性移除对应绑定,然后将其添加到文件上传方法上即可

所有分片文件上传完成后则是合并文件,合并的依据则是判断url上当前分片数和分片总数是否相等,如下:

既然是合并文件那就需要通过分片文件名称上末尾的分片号进行排序和拿到每一个分片文件路径以便合并后删除所有分片文件,所以我们定义如下类

最终合并文件方法,如下:

总结

下载地址:https://github.com/wangpengxpy/.netcoresliceupload。以上采用技巧式方案上实现了大文件分片处理,一些细节并未过多考虑,比如网络问题,中断问题。有些童鞋下载源码使用时所发现的文件合并被占用bug已解决并优化部分代码,借此实现希望对有需要的童鞋提供一点思考方向。

到此这篇关于.net core web api大文件分片上传研究实现的文章就介绍到这了,更多相关.net core web api分片上传内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!