2012-07-26 122 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