服务端传输文件设置客户端下载需要的Content-Length

问题

最近项目在做一个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

服务端传输文件设置客户端下载需要的Content-Length_第1张图片

修改后

tomcat的server.xml中配置compression="off",不启用gzip时,响应报文中有Content-Length

F12看到的返回的Response

服务端传输文件设置客户端下载需要的Content-Length_第2张图片

 

你可能感兴趣的:(Java)