附件的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
标记。
解
- 将
更改为
。 - 更新源代码:
- 更改
bw.write( getDomainDocument() );
tobw.write( document );
。 - 添加
String document = getDomainDocument();
到try/catch
的第一行。
- 更改
- 将
(未显示)更改为
。
实质上,删除与commandButton
相关的所有Ajax工具。 仍然可以显示错误消息并利用RichFaces UI样式。
参考
- 在jsf页面中使用commandButton下载文件
- http://www.coderanch.com/t/483892/JSF/java/when-commandButton-commandLink
- http://seamframework.org/135584.lace
尝试Content-Disposition
标头
Content-Disposition: attachment; filename=
这与MIME类型无关,而是与Content-Disposition标头无关,它应该类似于:
Content-Disposition: attachment; filename=genome.jpeg;
确保它实际上已正确传递给客户端(未由服务器,代理或其他东西过滤)。 您也可以尝试更改编写标题的顺序,并在获取输出流之前设置它们。