web-dev-qa-db-fra.com

Disposition du contenu de l'en-tête de la réponse HTTP pour les pièces jointes

Contexte

Écrivez un document XML dans le flux de réponse du navigateur et indiquez au navigateur une boîte de dialogue "Enregistrer sous".

Problème

Considérez la méthode download() suivante:

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

Dans Firefox, le contenu XML est affiché dans la fenêtre du navigateur. Dans IE 7, le contenu XML n'est pas affiché. Vous devez afficher la source du document. Aucune de ces situations n'est le résultat souhaité.

La page Web utilise le code suivant pour le bouton:

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

Le XML généré ne démarre pas par <?xml version="1.0"?>; le contenu XML ressemble plutôt à:

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

Mise à jour # 1

Notez la ligne de code suivante:

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

Mise à jour # 2

Utiliser <a4j:commandButton ... /> est le problème; un <h:commandButton .../> normal fonctionne comme prévu. L'utilisation de <h:commandBUtton .../> empêche le <a4j:outputPanel .../> d'actualiser les messages d'erreur.

Lié Message Seam .

Type de mime

Les types MIME suivants ne déclenchent pas la boîte de dialogue "Enregistrer sous":

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

Question

Quelles modifications provoqueront le a4j:commandButton à déclencher une boîte de dialogue "Enregistrer sous" afin que l'utilisateur soit invité à enregistrer le fichier XML (en tant que domain.xml)?

Je vous remercie.

20
Dave Jarvis

Problèmes

Le code a les problèmes suivants:

  • Un appel Ajax (<a4j:commandButton .../>) ne fonctionne pas avec les pièces jointes.
  • La création du contenu de sortie doit d'abord être effectuée.
  • L'affichage des messages d'erreur ne peut pas non plus utiliser les balises a4j basées sur Ajax.

Solution

  1. Remplacez <a4j:commandButton .../> par <h:commandButton .../>.
  2. Mettez à jour le code source:
    1. Remplacez bw.write( getDomainDocument() ); par bw.write( document );.
    2. Ajoutez String document = getDomainDocument(); à la première ligne du try/catch.
  3. Changez le <a4j:outputPanel.../> (non affiché) en <h:messages showDetail="false"/>.

Essentiellement, supprimez toutes les installations Ajax liées à commandButton. Il est toujours possible d'afficher des messages d'erreur et d'utiliser le style d'interface utilisateur RichFaces.

Références

7
Dave Jarvis

ni utiliser inline; ni attachement; juste utiliser

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

ou

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

ou

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

Essayez de changer votre type de contenu (type de support) en application/x-download et votre contenu-Disposition en: attachment;filename=" + fileName;

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

Essayez l'en-tête Content-Disposition

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

Cela n'a rien à voir avec le type MIME, mais l'en-tête Content-Disposition, qui devrait ressembler à ceci:

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

Assurez-vous qu’il est bien passé au client (non filtré par le serveur, proxy ou autre). Vous pouvez aussi essayer de changer l'ordre d'écriture des en-têtes et les définir avant d'obtenir le flux de sortie.

0
eeq