js 大文件分片上传处理如何实现?

JavaScript020

js 大文件分片上传处理如何实现?,第1张

推荐采用webuploader控件来解决。

关于WebUploader的功能说明:

大文件上传续传

支持超大文件上传(100G+)和续传,可以关闭浏览器,重启系统后仍然继续上传。

开源

提供ASP.NET,JSP,PHP示例和源代码,其中JSP提供MySQL,Oracle,SQL Server数据库的配置和示例代码。

分片、并发

分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。

当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。

预览、压缩

支持常用图片格式jpg,jpeg,gif,bmp,png预览与压缩,节省网络数据传输。

解析jpeg中的meta信息,对于各种orientation做了正确的处理,同时压缩后上传保留图片的所有原始meta数据。

多途径添加文件

支持文件多选,类型过滤,拖拽(文件&文件夹),图片粘贴功能。上传本地指定路径的文件,不需要通过点击按钮选择文件。

粘贴功能主要体现在当有图片数据在剪切板中时(截屏工具如QQ(Ctrl + ALT + A), 网页中右击图片点击复制),Ctrl + V便可添加此图片文件。

HTML5 &FLASH

兼容主流浏览器和低版本浏览器,接口一致,实现了两套运行时支持,用户无需关心内部用了什么内核。而且支持IE6,IE8浏览器。

同时Flash部分没有做任何UI相关的工作,方便不关心flash的用户扩展和自定义业务需求。

基于内存映射模式进行IO操作,充分发挥操作系统性能。

MD5秒传

当文件体积大、量比较多时,支持上传前做文件md5值验证,一致则可直接跳过。

如果服务端与前端统一修改算法,取段md5,可大大提升验证性能,耗时在20ms左右。

易扩展、可拆分

采用可拆分机制, 将各个功能独立成了小组件,可自由搭配。

采用AMD规范组织代码,清晰明了,方便高级玩家扩展。

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>upload</title><script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script></head><body><input type="file" name="file" id="file"><button id="upload" onClick="upload()">upload</button><script type="text/javascript">var bytesPerPiece = 1024 * 1024// 每个文件切片大小定为1MB . var totalPieces//发送请求 function upload() { var blob = document.getElementById("file").files[0]var start = 0var endvar index = 0var filesize = blob.sizevar filename = blob.name//计算文件切片总数 totalPieces = Math.ceil(filesize / bytesPerPiece)while(start <filesize) { end = start + bytesPerPieceif(end >filesize) { end = filesize} var chunk = blob.slice(start,end)//切割文件 var sliceIndex= blob.name + indexvar formData = new FormData()formData.append("file", chunk, filename)$.ajax({ url: 'http://localhost:9999/test.php', type: 'POST', cache: false, data: formData, processData: false, contentType: false, }).done(function(res){ }).fail(function(res) { })start = endindex++} } </script></body></html>

可以试试这样

前端通过 input type =  "file" 接收文件

然后使用文件的 slice 的方法对文件进行分片

将每一片提交到后台依次提交到后台,提交时通过 formData 提交,添加几个字段

(1). 这次上传文件的惟一 id

(2). 上传的状态,是开始,还是上传中,还是上传结束

(3). 分片的位置,比如是第一片,第二片

(4). 分片的数据

后端当接收到一个文件 id 的结束标识时,把对应的分片按位置数据拼接起来就行