Écrivez un document XML dans le flux de réponse du navigateur et indiquez au navigateur une boîte de dialogue "Enregistrer sous".
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>
Notez la ligne de code suivante:
response.setHeader( "Content-Disposition", "attachment;filename=" + filename );
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 .
Les types MIME suivants ne déclenchent pas la boîte de dialogue "Enregistrer sous":
"application/octet-stream"
"text/xml"
"text/plain"
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.
Le code a les problèmes suivants:
<a4j:commandButton .../>
) ne fonctionne pas avec les pièces jointes.a4j
basées sur Ajax.<a4j:commandButton .../>
par <h:commandButton .../>
.bw.write( getDomainDocument() );
par bw.write( document );
.String document = getDomainDocument();
à la première ligne du try/catch
.<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.
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('.')) + "\"");
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);
Essayez l'en-tête Content-Disposition
Content-Disposition: attachment; filename=<file name.ext>
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.