it-swarm.com.de

Inhalt der HTTP-Antwortheaderinhalte für Anhänge

Hintergrund

Schreiben Sie ein XML-Dokument in den Antwortstream eines Browsers und zeigen Sie an, dass der Browser ein Dialogfeld "Speichern unter" anzeigt.

Problem

Betrachten Sie die folgende download()-Methode:

  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 wird der XML-Inhalt im Browserfenster angezeigt. In IE 7 wird der XML-Inhalt nicht angezeigt - Sie müssen die Dokumentquelle anzeigen. Keine der beiden Situationen ist das gewünschte Ergebnis.

Die Webseite verwendet den folgenden Code für die Schaltfläche:

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

Die generierte XML-Datei nicht beginnt mit <?xml version="1.0"?>, vielmehr ähnelt der XML-Inhalt:

<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 Nr. 1

Beachten Sie die folgende Codezeile:

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

Update Nr. 2

Die Verwendung von <a4j:commandButton ... /> ist das Problem. Ein regulärer <h:commandButton .../> funktioniert wie erwartet. Durch die Verwendung von <h:commandBUtton .../> wird verhindert, dass <a4j:outputPanel .../> Fehlermeldungen aktualisiert.

Verwandte Nahtnachricht .

Mime Typ

Die folgenden Mime-Typen lösen den Dialog "Speichern unter" nicht aus:

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

Frage

Durch welche Änderungen wird a4j:commandButton ein Dialogfeld "Speichern unter" auslösen, sodass der Benutzer aufgefordert wird, die XML-Datei (als domain.xml) zu speichern?

Vielen Dank.

20
Dave Jarvis

Probleme

Der Code weist die folgenden Probleme auf:

  • Ein Ajax-Aufruf (<a4j:commandButton .../>) funktioniert nicht mit Anhängen.
  • Das Erstellen des Ausgabeinhalts muss zuerst erfolgen.
  • Das Anzeigen der Fehlermeldungen kann auch keine Ajax-basierten a4j-Tags verwenden.

Lösung

  1. Ändern Sie <a4j:commandButton .../> in <h:commandButton .../>.
  2. Aktualisieren Sie den Quellcode:
    1. Ändern Sie bw.write( getDomainDocument() ); in bw.write( document );.
    2. Fügen Sie String document = getDomainDocument(); zur ersten Zeile des try/catch hinzu.
  3. Ändern Sie den <a4j:outputPanel.../> (nicht gezeigt) in <h:messages showDetail="false"/>.

Entfernen Sie im Wesentlichen alle Ajax-Funktionen, die sich auf commandButton beziehen. Es ist immer noch möglich, Fehlermeldungen anzuzeigen und den RichFaces-UI-Stil zu nutzen.

Verweise

7
Dave Jarvis

weder inline verwenden; noch Anlage; benutz einfach

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

oder

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

oder

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

Ändern Sie Ihren Inhaltstyp (Medientyp) in application/x-download und Ihre Inhaltsdisposition in: attachment;filename=" + fileName;.

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

Versuchen Sie die Content-Disposition-Kopfzeile

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

Dies hat nichts mit dem MIME-Typ zu tun, sondern mit dem Content-Disposition-Header. Dieser sollte ungefähr so ​​aussehen:

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

Stellen Sie sicher, dass es tatsächlich an den Client weitergegeben wird (nicht durch den Server, den Proxy oder etwas anderes gefiltert). Sie können auch versuchen, die Reihenfolge der Schreibkopfzeilen zu ändern und sie vor dem Ausgabe-Stream festzulegen.

0
eeq