问题
最近项目在做一个app在线升级的功能,由于公司没有OSS存储,也只有一个文件所以存到数据库中,客户端请求下载需要Content-Length 属性去显示下载进度,服务端设置了Content-Length 但是到服务器上就变成了 Transfer-Encoding: chunked,
解决
服务端关键代码
InputStream bis = appVersion.getApp();
byte[] buff = new byte[bis.available()];
bis.read(buff);
bis.close();
// 清空response
response.reset();
response.setContentType("application/octet-stream");
// 设置文件大小
response.addHeader("Content-Length", String.valueOf(bis.available());
response.addHeader("Content-Disposition", "attachment;filename=" + "dist.zip");
os = response.getOutputStream();
os.write(buff);
os.flush();
os.close();
需要修改tomcat的server.xml的compression 为off不进行压缩,注意需要衡量项目是否需要压缩的东西比较多
compression:指定是否对响应的数据进行压缩。off:表示禁止压缩、on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off
我们来看下修改前后的对比:
修改前
tomcat的server.xml中配置compression="on 或 force",会启用gzip,即使服务端设置了Content-Length,响应报文中也会变为Transfer-Encoding: chunked
F12看到的返回的Response
修改后
tomcat的server.xml中配置compression="off",不启用gzip时,响应报文中有Content-Length
F12看到的返回的Response
更多推荐
服务端传输文件设置客户端下载需要的Content-Length
发布评论