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

2022-09-02 01:34:17

背景

将 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 内容 - 您必须查看文档源。这两种情况都不是预期的结果。

网页对按钮使用以下代码:

    <a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />

生成的 XML 以 开头,而是 XML 内容类似于:<?xml version="1.0"?>

<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
  <items>
    <item description="EDT Class Code" descriptionId="" label="EDT Class Code" labelId="" resourceId="as_pay_payrolldeduction.edtclass"/>
  </items>
  <resources>
    <jdbcTable datasourceId="JNDI" id="as_pay_payrolldeduction" tableName="as_pay.payrolldeduction">
      <fieldList>
        <field id="payamount" type="java.math.BigDecimal"/>
      </fieldList>
    </jdbcTable>
  </resources>
</schema>

更新 #1

请注意以下代码行:

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

更新 #2

使用是问题所在;定期按预期执行。使用 可防止 刷新任何错误消息。<a4j:commandButton ... /><h:commandButton .../><h:commandBUtton .../><a4j:outputPanel .../>

相关接缝消息

哑剧类型

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

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

问题

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

谢谢。


答案 1

既不使用内联;也没有依恋;只需使用

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('.')) + "\"");

答案 2

尝试将内容类型(媒体类型)更改为以下内容,并将内容处置更改为:application/x-downloadattachment;filename=" + fileName;

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

推荐