HTTP大文件上传思路和总结
无法http大文件一次性上传的原因
存在文件上传大小的限制
- 默认一般nginx和tomcat都会对上传文件大小进行限制
nginx的配置文件nginx.conf设置 client_max_body_size 20m; - tomcat默认设置能接收HTTP POST请求的大小最大为2M。如果POST请求传递的数据大于2M,就会报错误。解决方案:修改tomcat的配置server.xml中
标签,在该标签中添 加”maxPostSize”属性,将该属性值设置成你想要的最大值,单位是字节,或者把这个值设置为 0(maxPostSize=”0”)。 - Tomcat项目的web配置。工程项目web.xml的配置
1 | <servlet> |
- Spring配置文件限制上传文件的大小
1 | <bean id="multipartResolver" |
解决方案
错误方案1:
1、分片上传大文件
2、服务端将每片文件存成临时文件,然后在进行合并文件。
存在无核实合并文件是否正确的问题
错误方案2:
md5文件摘要,确保合并文件没有问题。
存在重复造轮子问题。在分布式服务器中进行分片上传无法控制同一个服务器上
前端选择WebUploader进行上传。
后端没有选择控制nginx路由到指定服务器,而是选择单点文件上传服务thrift。
单点文件上传服务thrift提供功能
- 存储分片文件和合并分片文件进行存储
- 获取文件上传的状态
前后端交互流程:
- 前端向服务器获取上传文件的唯一标识。(可以写入数据库获取id标识)
- 前端将指定文件md5,分片上传 {file,chunk,chunks,md5value,唯一id标识, 额外自定义字段}
- 服务端检查是否存在唯一id标识,校验参数正确性
- 调用单点文件上传服务,存储指定文件路径夹下(使用
md5Value+userId+唯一id标识
作为唯一文件夹名称) - 单点文件上传服务通过对分片文件进行排序统计返回是否可以进行合并文件操作。 | 单点文件上传服务通过对分片文件进行排序统计返回是否正在进行合并操作。
- 调用单点文件上传服务,存储指定文件路径夹下(使用
- 前端收到合并信息停止上传文片文件并调用服务端进行文件合并。
- 服务端清理相关的文件夹。
- 当前端接收上传失败的信息,需要调用服务端清理相关文件的操作。
安卓APK文件上传(不是特别规范,有待以后自己多加研究)
前端分片文件 -> 服务端 -> 单点文件服务
- 单点文件服务是否在合并文件 -> 服务端 -> 前端
这一步就是为了让服务端分片不去占用磁盘。降低出错下,产生大量临时文件
前端删除分片文件 -> 服务端 -> 单点文件服务
- 单点文件服务删除分片文件 -> 服务端 -> 前端
增加这一步的原因:APK远程上传到CDN上耗时较长,容易超过request时间。改用轮询来处理,让界面不卡死,容易有反馈。
前端获取APK文件上传状态 -> 服务端 -> 单点文件服务
- 单点文件服务APK上传状态 -> 服务端 -> 前端
推荐了解网址:
大文件分步式分片上传和续传
聊聊大文件上传
HTTP文件上传的一个后端完善方案(NginX)
大文件上传解决方案