2012-07-26 116 views
0

我正在使用Apache POI生成帶.docx擴展名的文檔。我在標題響應(HttpServletResponse)中設置了文件名,但瀏覽器在我的URL末尾保存了一個同名的文件,例如:Apache POI + RichFaces 4 - docx文件名

我的瀏覽器中的URL是:localhost:8080/MyProject/mypage.jsf ,下載文件的名稱是mypage.jsf,忽略頭中設置的名稱(HttpServletResponse)。如果我編輯docx的文件擴展名,內容是確定的。

下面的代碼:

private void generateDocument() throws IOException{ 
     XWPFDocument document = new XWPFDocument(); 
     //load document here 

     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     HttpServletResponse response = (HttpServletResponse) facesContext 
       .getExternalContext().getResponse(); 

     response.reset(); 
     response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 

     ServletOutputStream out = response.getOutputStream(); 
     document.write(out); 

     response.setHeader("Content-Disposition", 
       "attachment; filename=my_document.docx"); 
     facesContext.responseComplete();    
} 

詩篇。我使用RichFaces的4

感謝

+2

你嘗試移動response.setHeader調用你寫的servlet輸出流之前?我不知道你的servlet設置,但是在寫內容之前大多數所有頭文件都需要去掉 – Gagravarr 2012-07-26 20:09:56

+1

另外,不要忘記在設置響應完成之前刷新輸出流並關閉它。 – 2012-07-26 20:45:06

+0

@Gagravarr,它的工作! Luiggi門多薩,真的很有必要。謝謝大家。 – vctlzac 2012-07-27 00:02:05

回答

0

從一個答案評論推動:

你應該移動response.setHeader調用你寫的servlet輸出流之前。除非你的框架正在做一個史詩級的緩衝,否則框架在你將excel文件寫入流之前很久就會發送響應頭。標題必須在數據之前發送,因此只要您開始發送數據,就不能再添加新的標題。 (大多數框架都做了一點緩衝,所以在使用簡單的文本輸出時,即使在寫出幾行響應之後,通常也可以偷偷寫入一些額外的頭文件,最好不要依賴於這個,如果你能避免它)

你的代碼應該改爲:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) facesContext 
      .getExternalContext().getResponse(); 

    response.reset(); 
    response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
    response.setHeader("Content-Disposition", 
      "attachment; filename=my_document.docx"); 

    ServletOutputStream out = response.getOutputStream(); 
    document.write(out); 

    facesContext.responseComplete();   
+0

我們還必須考慮@Luiggi門多薩的意見。感謝您的解釋。 – vctlzac 2012-07-27 11:23:35

+0

取決於你的框架。大多數會自動沖洗近距離,但我想你可能會發現一個是壞的,並不.... – Gagravarr 2012-07-27 11:28:13