附件的HTTP响应标头内容处置

背景

将XML文档写入浏览器的响应流,并使浏览器显示“另存为”对话框。

问题

考虑以下download()方法:

  HttpServletResponse response = getResponse(); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( response.getOutputStream() ) ); String filename = "domain.xml"; String mimeType = new MimetypesFileTypeMap().getContentType( filename ); // Prints "application/octet-stream" System.out.println( "mimeType: " + mimeType ); // response.setContentType( "text/xml;charset=UTF-8" ); response.setContentType( mimeType ); response.setHeader( "Content-Disposition", "attachment;filename=" + filename ); bw.write( getDomainDocument() ); bw.flush(); bw.close(); 

在Firefox中,XML内容显示在浏览器窗口中。 在IE 7中,不显示XML内容 – 您必须查看文档源。 这两种情况都不是理想的结果。

该网页使用以下代码作为按钮:

   

生成的XML 不是开头,而是XML内容类似于:

             

更新#1

请注意以下代码行:

 response.setHeader( "Content-Disposition", "attachment;filename=" + filename ); 

更新#2

使用是问题所在; 常规按预期执行。 使用可防止刷新任何错误消息。

相关的Seam消息 。

Mime类型

以下mime类型不会触发“另存为”对话框:

  • "application/octet-stream"
  • "text/xml"
  • "text/plain"

哪些更改将导致a4j:commandButton触发“另存为”对话框,以便提示用户保存XML文件(如domain.xml )?

谢谢。

既不使用内联; 也不依附; 只是用

 response.setContentType("text/xml"); response.setHeader( "Content-Disposition", "filename=" + filename ); 

要么

 response.setHeader( "Content-Disposition", "filename=\"" + filename + "\"" ); 

要么

 response.setHeader( "Content-Disposition", "filename=\"" + filename.substring(0, filename.lastIndexOf('.')) + "\""); 

尝试将您的内容类型(媒体类型)更改为application/x-download并将Content-Disposition更改为: attachment;filename=" + fileName;

 response.setContentType("application/x-download"); response.setHeader("Content-disposition", "attachment; filename=" + fileName); 

问题

该代码具有以下问题:

  • Ajax调用( )不适用于附件。
  • 必须首先创建输出内容。
  • 显示错误消息也不能使用基于Ajax的a4j标记。

  1. 更改为
  2. 更新源代码:
    1. 更改bw.write( getDomainDocument() ); to bw.write( document );
    2. 添加String document = getDomainDocument();try/catch的第一行。
  3. (未显示)更改为

实质上,删除与commandButton相关的所有Ajax工具。 仍然可以显示错误消息并利用RichFaces UI样式。

参考

尝试Content-Disposition标头

 Content-Disposition: attachment; filename= 

这与MIME类型无关,而是与Content-Disposition标头无关,它应该类似于:

 Content-Disposition: attachment; filename=genome.jpeg; 

确保它实际上已正确传递给客户端(未由服务器,代理或其他东西过滤)。 您也可以尝试更改编写标题的顺序,并在获取输出流之前设置它们。