大文件下载优化方案(nginx+Springboot+vue)---非常完美
系统中有个文件下载的功能,下载的文件从1k-几十G不等,小文件下载没有问题,只要上G了,下载大概率失败。基于以上现状,对技术方案记性优化。
2.1 服务器读取文件流传输+前端blob接收
描述:
后端接口通过response的IO通道,读写文件流传输前端接收Blob数据,等所有接收完成,再保存成文件 优点:传统方案,方案固定好写
缺点:文件先读到内存再输出,存在服务器压力;大文件传输过程中客户端和服务器的连接管道容易断开:broken pieped;前端接收内存压力;进度需要自己记录和计算;
2.2 使用NIO读取写入(同上)
描述:传输速度比BIO能快10倍以内
优缺点同上;
2.3 分片下载
描述:前端和后端都使用分片下载,等前端把所有的分片下载完成再合并成一个文件;
优缺点同上;能减少连接断开的概率;
3、完美方案:
目标:有进度显示;能正常下载完成;多人下载无压力;
描述:
进度显示:前端使用window.location.href=下载文件连接? 的形式;后端接口改成GET接口,参数拼接在url后面,包括token:因为href是新启动一个请求,并且header不能自定义,所以接口的鉴权只能放在url后面;后端接口对url参数和token进行验证;开始后端接口逻辑:获取文件路径,设置response的header属性,重定向到Nginx配置的内部文件路由nginx返回文件信息浏览器接收并在下方显示下载进度 Nginx.conf配置
Java代码: