poi導出excel打開文件時部分內容有問題


問題描述: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 來捶我吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM