这一步实现了文件上传(包括批量)、断点续传、大文件(伪)秒传。但仍然存在不足,待改进。
整体实现的思路是这样:
- 首先是获取文件加密字符串
- 根据md5检查文件的状态:已存在、未完成、不存在。
- 对于已存在的文件,这是直接就显示上传完成。
- 未完成文件和不存在的文件进行分片上传。
- 后台进行文件的保存方式是追加的方式,生成临时文件.part。
- 上传完成之后生成md5后缀为.ok的空文件,待检查使用。同时经上传的临时文件改成原来的名字。
获取文件加密字符串
更改yyupload()
的参数个数,一下所有的js函数,均写在该函数内部(注意缩进)
1 | function yyupload(file, dommsg, dompercentmb, domprogress, domtime, fn) { |
文件加密结束后,根据MD5密钥,调用checkfile()
函数检查服务器上有没有该文件
检查服务器上是否存在文件
这个检查函数是比较重要的分叉口,根据检查的结果,对文件的处理是不同的。
1 | function checkfile(md5value, file){ |
swich()
处理传回来的参数:
- 0 服务器上不存在该文件
- 1 服务器上存在该文件,但是并未上传完成
- 2 服务器上存在完整的文件,不需要再上传了
对于不需要上传的文件,我们可以之后显示上传完成,造成“秒传”的景象。
1 | //实现秒传功能 |
编写views.py文件中的CheckFileHandler
1 | class CheckFileHandler(tornado.web.RequestHandler): |
编写urls.py文件中的路由/checkfile
1 | (r'^/checkfile$', CheckFileHandler), |
当然别忘了from views import CheckFileHandler,
上传文件处理
这一块是处理的核心,js将文件分片,传给后台进行保存。不说废话,上代码:
1 | function doUpload(file, md5value, startindex) { |
文件上传结束时,通知服务器:(……表示连接着的)
1 | …… |
将分片文件上传到服务器:
1 | …… |
这里有两个后台处理程序。
在views.py中编写 UploadJobHandler
、 FinishUpload
1 | class UploadJobHandler(tornado.web.RequestHandler): |
注意:
- 文件在上传时,临时文件名为 md5value + “.part”
- 上传成功后,创建空文件 md5value + “.ok”
- 文件保存的时候,这里是使用二进制方式追加,否则保存的文件不可用了。
编写urls.py文件中的路由/uploadfile
、/finishupload
1 |
|
效果如下图
不足
- 大文件上传,速度仍是不理想
- 对于大文件,断点续传,可能导致文件不能用
- 上传速度受网速影响
接下来该改进了,到此,以上参考的是大文件分块上传技术分享(c#实现),特此感谢分享。