2011-01-28 4 views
5

Tengo una aplicación web Java que crea un pdf y lo transmite de vuelta al navegador.Establecer el nombre de archivo del PDF que se transmite de vuelta al navegador

byte[] pdf = report.exportPdfToArray(user); 
response.setContentType("application/pdf"); 
response.setHeader("content-disposition", "inline; filename=\"My.pdf\""); 
outStream = response.getOutputStream(); 
outStream.write(pdf); 
outStream.flush(); 
outStream.close(); 

El informe se ejecuta y se envía de vuelta al navegador, pero no puede controlar el nombre del archivo a pesar de que me puse la content-disposition. Estoy usando Jboss 4.2.1. ¿Sabes lo que me estoy perdiendo?

EDIT: Entonces, ¿hay alguna manera de establecer el nombre de archivo cuando el contenido-disposición está en línea?

+1

Algunos navegadores, a saber, IE6, actúan de forma divertida al respecto a veces. Tuve que agregar algo como? F =/myfile.pdf al final de la cadena de consulta para que funcione en IE6. – Spliffster

Respuesta

8

content-disposition: attachment ....

+0

Pero no quiero descargar el archivo. Quiero mostrarlo en el navegador. – Atticus

+0

@Atticus: debo confirmar que tengo el mismo problema, agregue que no funciona con 'inline' en línea (IE y Firefox) – Ralph

+0

El pdf recibe el nombre del servlet. ¿Existe alguna posibilidad de establecer el título de la página (en la que se muestra el pdf)? – Atticus

1

No puedo detectar un error. ¿Revisaste el comportamiento con otros navegadores/lectores?

A partir del RFC, no se define lo que el cliente tiene que ver con la información de nombre de archivo si se muestra en línea ...

+0

Es aún peor, RFC: el remitente puede querer sugerir un nombre de archivo para ser utilizado si la entidad es separada y almacenada en un archivo separado. Si el MUA receptor escribe la entidad en un archivo, el nombre de archivo sugerido debe usarse como una base para el nombre de archivo real, cuando sea posible. Es importante que el MUA receptor no use a ciegas el nombre de archivo sugerido. El nombre de archivo sugerido DEBE ser verificado (y posiblemente cambiado) para ver que se ajusta a las convenciones del sistema de archivos local, no sobrescribe un archivo existente, y no presenta un problema de seguridad ... – Ralph

+1

ahora hay una falla en la implementación anterior pero en varias versiones de IE y cómo IE o el complemento Acrobat maneja los encabezados de respuesta HTTP. No he tenido problemas con otros navegadores. – Spliffster

-2

Hay solución para hacerlo. Podemos usar iframe donde iframe se abrirá en la página html, iframe contendrá el informe pdf mientras que la página html es independiente de iframe. Podemos editar el título de la página html que contiene iframe.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<html> 
    <head> 
     <title>${reportName}</title> 
    </head> 
    <body> 
     <iframe src="/fcWeb/ReportPDFServlet" width="100%" height="100%"></iframe> 
    </body> 
</html> 
+0

Hay algo que no se escribe sobre el código aquí. Eche un vistazo [a esta guía] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) y luego edite su respuesta para solucionarlo tal vez? – Flexo

3

MSIE utilizará la última parte de la información de la ruta de la URL de solicitud (la parte después de la última /) como nombre de archivo por defecto del Guardar como acción. Ignora por completo el atributo filename del encabezado Content-Disposition. Todos los demás navegadores tratan ese encabezado correctamente.

Necesita cambiar el patrón de URL de su servlet de PDF a una asignación de ruta. Es decir. no use /pdf con http://example.com/context/pdf, sino más bien use /pdf/* con http://example.com/context/pdf/report.pdf. De esta forma, MSIE utilizará "report.pdf" en lugar de "pdf" como el nombre de archivo predeterminado para la acción Guardar como.

2

He intentado una solución en Java y funcionó.

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\""); 
response.setContentType("application/pdf; name=\"MyFile.pdf\""); 
response.getOutputStream().write(pdfAsBytesArray); 
0

Es raro pero puede ser útil para alguien (tal vez alguien puede decir lo que está mal con él):

Cuando me puse dos cabeceras como:

response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size())); 
response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\""); 

No hace trabajo. Pero cuando cambio el orden, funciona como esperaba:

response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\""); 
response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size())); 
Cuestiones relacionadas