关于springmvc 文件下载,nginx 转发去掉了content-length ,浏览器前端下载没有进度,无法显示文件总大小的问题。

若要前端、浏览器显示下载进度,就必须直到问价总大小,要直到文件总大小就必须后端在响应头中加上content-length 即文件总大小。

Content-Length:byte大小

 若响应有content-length时,浏览器会显示文件大小,如:

若响应没有content-length时,浏览器只会显示下载多少:

 java下载代码

 1 /**
 2      * 下载/导出本地文件
 3      *
 4      * @author:
 5      * @param request
 6      * @param response
 7      * @param fileBytesLength 数据
 8      * @param fileLocalPath
 9      * @param responseContentType
10      * @param downFileName
11      * @throws Exception
12      */
13     public static void download(HttpServletRequest request, HttpServletResponse response,
14             String fileLocalPath,String responseContentType, String downFileName) throws Exception {
15         response.setContentType("text/html;charset=UTF-8");
16         request.setCharacterEncoding("UTF-8");
17         BufferedInputStream bis = null;
18         BufferedOutputStream bos = null;
19         File file=new File(fileLocalPath);
20         long fileLength = file.length();
21         response.setContentType(responseContentType);
22         response.setHeader("Content-disposition",
23                 "attachment; filename=" + new String(downFileName.getBytes("utf-8"), "ISO8859-1"));
24         response.setHeader("Content-Length", String.valueOf(fileLength));
25         bis = new BufferedInputStream(new FileInputStream(file));
26         bos = new BufferedOutputStream(response.getOutputStream());
27         byte[] buff = new byte[1024*10];
28         int bytesRead;
29         while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
30             bos.write(buff, 0, bytesRead);
31         }
32         bis.close();
33         bos.close();
34     }

注意当content-length 设置多大,若content-length设置比文件要小,则浏览器就会在下载这么大的时候就断掉认为下载完了,即使后端还没有传输完。

直接访问springmvc 接口没有问题,可以看到响应头中有content-length。

但是经过nginx 转发后,响应头中可能就没有了content-length。

原因可能如下:

(1)启用了gzip,把其off 或者注释调即可。

若启用gzip压缩,则响应头中会增加如下header,同时nginx在响应时会去掉content-length头。

(2)网上有说要通过chunked_transfer_encoding off;关掉chunked传输
如果存在Transfer-Encoding(重点是chunked),则在header中不能有Content-Length,有也会被忽视。

但经测试开启gzip 即使chunked_transfer_encoding off;,content-length也会去掉。

而关闭gzip ,即使不写chunked_transfer_encoding off; content-length也不会去掉。

网上默认说chunked_transfer_encoding 默认on;但由上面测试得知好像是off,

网上资料

转自:https://blog.csdn.net/u013378306/article/details/123742708

 

posted @ 2022-09-15 15:14  Boblim  阅读(1324)  评论(0编辑  收藏  举报