简体   繁体   中英

HTTP response header content disposition for attachments

Background

Write an XML document to a browser's response stream and cause the browser to display a "Save As" dialog.

Problem

Consider the following download() method:

  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();

In Firefox, the XML content is displayed in the browser window. In IE 7, the XML content is not displayed -- you have to view the document source. Neither situation is the desired result.

The web page uses the following code for the button:

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

The XML that is generated does not start with <?xml version="1.0"?> , rather the XML content resembles:

<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>

Update #1

Note the following line of code:

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

Update #2

Using <a4j:commandButton ... /> is the problem; a regular <h:commandButton .../> performs as expected. Using the <h:commandBUtton .../> prevents the <a4j:outputPanel .../> from refreshing any error messages.

Related Seam Message .

Mime Type

The following mime types do not trigger the "Save As" dialog:

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

Question

What changes will cause the a4j:commandButton to trigger a "Save As" dialog box so that the user is prompted to save the XML file (as domain.xml )?

Thank you.

neither use inline; nor attachment; just use

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

or

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

or

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

Try changing your Content Type (media type) to application/x-download and your Content-Disposition to: attachment;filename=" + fileName;

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

Problems

The code has the following issues:

  • An Ajax call ( <a4j:commandButton .../> ) does not work with attachments.
  • Creating the output content must happen first.
  • Displaying the error messages also cannot use Ajax-based a4j tags.

Solution

  1. Change <a4j:commandButton .../> to <h:commandButton .../> .
  2. Update the source code:
    1. Change bw.write( getDomainDocument() ); to bw.write( document ); .
    2. Add String document = getDomainDocument(); to the first line of the try/catch .
  3. Change the <a4j:outputPanel.../> (not shown) to <h:messages showDetail="false"/> .

Essentially, remove all the Ajax facilities related to the commandButton . It is still possible to display error messages and leverage the RichFaces UI style.

References

尝试Content-Disposition标头

Content-Disposition: attachment; filename=<file name.ext> 

This has nothing to do with the MIME type, but the Content-Disposition header, which should be something like:

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

Make sure it is actually correctly passed to the client (not filtered by the server, proxy or something). Also you could try to change the order of writing headers and set them before getting output stream.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM