問題描述:JavaWeb項目,ssm框架,從tomcat9.0.30換到weblogic10.3.6.0后,poi導出excel,打開文件時部分內容有問題;
解決:
response.addHeader("Content-Length", "" + outfile.length());
替換成:
response.setHeader("Content-Length", "" + outfile.length());
分析一:
addHeader方法添加兩個完全一樣的信息時,總是為響應增加新的頭部;
setHeader()添加兩個完全一樣的信息時,總是用新值去替換舊值;
分析二:
我用F12看了我這個下載方法的響應頭:
Response Headers:
Content-Disposition: attachment;filename=項目設置-1592298665653.xlsx
Content-Length: 4909
Content-Type: application/octet-stream
Date: Tue, 16 Jun 2020 09:11:05 GMT
Transfer-Encoding: chunked
在setHeader方法中,並沒有最后標紅的Transfer-Encoding: chunked,而在addHeader方法中是有這個字段的;
(這:我的response中並沒有設置Transfer-Encoding這個字段,setHeader也只是覆蓋了Content-Length,這是為什么。。。我tm太菜了嘛。。。)
分析三:
這次只能分析Transfer-Encoding: chunked了:
分塊編碼(Transfer-Encoding: chunked)
1、Transfer-Encoding,是一個 HTTP 頭部字段(響應頭域),字面意思是「傳輸編碼」。最新的 HTTP 規范里,只定義了一種編碼傳輸:分塊編碼(chunked)。
2、分塊傳輸編碼(Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許HTTP由網頁服務器發送給客戶端的數據可以分成多個部分。分塊傳輸編碼只在HTTP協議1.1版本(HTTP/1.1)中提供。
3、數據分解成一系列數據塊,並以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。
4、具體方法
a)在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報文采用了分塊編碼。這時,報文中的實體需要改為用一系列分塊來傳輸。
b)每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括它結尾的 CRLF(\r\n),也不包括分塊數據結尾的 CRLF。
c)最后一個分塊長度值必須為 0,對應的分塊數據沒有內容,表示實體結束。
big old: 看懂了嗎?
me: 沒有
big old: 呵呵(sb)
大概意思是說:這東西是http的數據傳輸機制,一塊塊的傳,不用考慮發送內容的總大小;
me: 但是為什么生成的文件比不加Transfer-Encoding: chunked大了些,以至於打開文件時部分內容有問題(明明addHeader方法也設置了Content-Length)?
big old:
參考文章1:https://www.cnblogs.com/raychou1995/p/10201878.html
參考文章2:https://www.jianshu.com/p/da01a20a515e
我也不知道為啥了,big old 來捶我吧!