网站建设资质,惠州网站建设是什么意思,建造自己的网站,网站产品优化1、背景#xff1a;
系统中有个文件下载的功能#xff0c;下载的文件从1k-几十G不等#xff0c;小文件下载没有问题#xff0c;只要上G了#xff0c;下载大概率失败。基于以上现状#xff0c;对技术方案记性优化。
2、历史方案#xff1a;
2.1 服务器读取文件流传输前…1、背景
系统中有个文件下载的功能下载的文件从1k-几十G不等小文件下载没有问题只要上G了下载大概率失败。基于以上现状对技术方案记性优化。
2、历史方案
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配置
location /ngdownload {alias /opt/data;#文件目录的前缀internal;#标识内部接口
}Java代码
public void downloadByLink(HttpServletResponse response, String fileId) {//查询附件信息File file getFile();//自己实现//鉴权实际已经通过gateway完成try {String fileName URLEncoder.encode(file.getName(), UTF-8);//Content-Disposition 表示文件的下载方式attachment 表示文件需要下载而不是在浏览器中打开response.addHeader(Content-Disposition, attachment;filename fileName);//设置URI给nginx进行内部的跳转/ngndownloadresponse.setHeader(X-Accel-Redirect, /ngndownload fileName ); //限速 尽量不设置response.setHeader(X-Accel-Limit-Rate, 202400); } catch (UnsupportedEncodingException e) {log.error(文件下载失败 , e);throw new BusinessException(文件下载失败);}}