java - que - Disposición de contenido de encabezado de respuesta HTTP para archivos adjuntos
header(''content-type: text/html; charset=utf-8''); (5)
Problemas
El código tiene los siguientes problemas:
- Una llamada Ajax (
<a4j:commandButton .../>
) no funciona con archivos adjuntos. - La creación del contenido de salida debe suceder primero.
- La visualización de los mensajes de error tampoco puede utilizar etiquetas
a4j
basadas ena4j
.
Solución
- Cambie
<a4j:commandButton .../>
por<h:commandButton .../>
. - Actualizar el código fuente:
- Cambie
bw.write( getDomainDocument() );
bw.write( document );
. - Agregar
String document = getDomainDocument();
a la primera línea deltry/catch
.
- Cambie
- Cambie
<a4j:outputPanel.../>
(no se muestra) a<h:messages showDetail="false"/>
.
Esencialmente, elimine todas las facilidades de Ajax relacionadas con el commandButton
. Todavía es posible mostrar mensajes de error y aprovechar el estilo de la interfaz de usuario de RichFaces.
Referencias
Fondo
Escriba un documento XML en el flujo de respuesta de un navegador y haga que el navegador muestre el cuadro de diálogo "Guardar como".
Problema
Considere el siguiente método de 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();
En Firefox, el contenido XML se muestra en la ventana del navegador. En IE 7, el contenido XML no se muestra, debe ver el origen del documento. Ninguna de las dos situaciones es el resultado deseado.
La página web utiliza el siguiente código para el botón:
<a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />
El XML que se genera no comienza con <?xml version="1.0"?>
, Más bien el contenido XML se asemeja a:
<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>
Actualización # 1
Tenga en cuenta la siguiente línea de código:
response.setHeader( "Content-Disposition", "attachment;filename=" + filename );
Actualización # 2
Usando <a4j:commandButton ... />
es el problema; un <h:commandButton .../>
funciona como se espera. El uso de <h:commandBUtton .../>
evita que <a4j:outputPanel .../>
los mensajes de error.
Mensaje de costura relacionado.
Tipo MIME
Los siguientes tipos de mime no activan el cuadro de diálogo "Guardar como":
-
"application/octet-stream"
-
"text/xml"
-
"text/plain"
Pregunta
¿Qué cambios harán que a4j:commandButton
active el cuadro de diálogo "Guardar como" para que se le solicite al usuario que guarde el archivo XML (como domain.xml
)?
Gracias.
Esto no tiene nada que ver con el tipo MIME, sino con el encabezado Content-Disposition, que debería ser algo como:
Content-Disposition: attachment; filename=genome.jpeg;
Asegúrese de que en realidad se haya pasado correctamente al cliente (no filtrado por el servidor, el proxy o algo así). También puede intentar cambiar el orden de escritura de los encabezados y establecerlos antes de obtener el flujo de salida.
Intente cambiar su Tipo de contenido (tipo de medio) a application/x-download
y su Disposición de contenido a: attachment;filename=" + fileName;
response.setContentType("application/x-download");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
Prueba el encabezado Content-Disposition
Content-Disposition: attachment; filename=<file name.ext>
ni uso en línea; ni apego; Solo usa
response.setContentType("text/xml");
response.setHeader( "Content-Disposition", "filename=" + filename );
o
response.setHeader( "Content-Disposition", "filename=/"" + filename + "/"" );
o
response.setHeader( "Content-Disposition", "filename=/"" +
filename.substring(0, filename.lastIndexOf(''.'')) + "/"");