2012-07-18 20 views
5

Estoy tratando de crear dinámicamente un PDF en línea que, cuando el usuario elija guardarlo, solicite mi nombre de archivo personalizado. De acuerdo con the documentation, el atributo saveasname debe hacer lo que yo quiera.Content-disposition siendo ignorado en IE 9 y Firefox 13

(formato = "PDF" solamente) El nombre de archivo que aparece en el cuadro de diálogo Guardar como cuando un usuario guarda un archivo PDF escrito en el navegador.

Sin embargo, lo que sucede tanto en IE 9 como en Firefox 13.0.1 es que el nombre de archivo que aparece en el cuadro de diálogo Guardar es igual que mi plantilla CF, pero con una extensión PDF. (En otras palabras, mi código está en makepdf.cfm y SaveAs me pide que guarde makepdf.pdf.) En Chrome, sin embargo, funciona perfectamente. (Todo en Windows 7.)

Aquí está mi código para crear el PDF:

<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf"> 

Si declaro explícitamente la disposición de contenido y tipo de contenido, al igual que

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf"> 
<cfcontent type="application/x-pdf"> 
<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf"> 
  • Chrome me dice que "Content-Disposition" ha sido declarado dos veces
  • Firefox me dice que el archivo PDF está corrupto
  • es decir, justo lo ignora (y todavía no muestra el nombre de archivo de la derecha)

Si sólo se basan en la cabecera

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf"> 
<cfcontent type="application/x-pdf"> 
<cfdocument format="pdf" bookmark="true"> 

consigo el mismo comportamiento que el primer fragmento de código.

Sé cómo hacer que el navegador solicite la descarga en lugar de mostrar en línea, y todo funciona como se esperaba en ese momento, pero ese no es el comportamiento deseado.

Necesito usar las horas y las fechas en los nombres de los archivos y los usuarios finales no son lo suficientemente inteligentes como para no sobrescribir sus archivos (en caso de que opten por guardarlos).

¿Hay algo que me falta que haga que IE y Firefox hagan lo que se supone que deben hacer? ¿Qué otros navegadores van a hacer esto? Mobile Safari?

Respuesta

2

El problema parece ser que "archivo = xxx" fue realmente la intención de la disposición "unión", y no todos los plugins de navegador PDF reconocen como un mecanismo para especificar el "guardar como" en línea, como has descubierto.

Un enfoque diferente para hacer que todos utilicen su nombre de archivo preferido sería manipular la URL utilizando las reglas de reescritura del servidor web. Como un simple ejemplo, tendría su script para generar los pdfs y publicarlos en línea: pdf.pcm

<cfheader name="Content-Disposition" value="inline"> 
<cfdocument format="PDF" mimetype="application/pdf">Test</cfdocument> 

A continuación, crear una regla de reescritura que coincide con las direcciones URL en forma /pdf/miNombreArchivo y los pasa al pdf.cfm. En IIS7 esto podría ser:

<rule name="Inline PDF SaveAs" stopProcessing="true"> 
    <match url="^/pdf/[\w-]+$" ignoreCase="true" /> 
    <action type="Rewrite" url="/pdf.cfm" appendQueryString="false" /> 
</rule> 

Esto hará coincidir los nombres de archivo que contengan caracteres alfanuméricos, guiones bajos y guiones únicamente. No querrá permitir espacios ni caracteres de nombre de archivo inválidos.

Al acceder a /pdf/myreport el PDF se mostrará en línea por el plugin, y cuando lo guarde, el nombre de archivo por defecto será myreport.pdf.

Si está utilizando un marco que admite las URL seguras del motor de búsqueda o "rutas", podría hacer lo mismo sin necesidad de reescrituras del servidor web.

ACTUALIZACIÓN: De hecho, no es necesario utilizar la reescritura de URL: simplemente añada una barra diagonal y luego el nombre de archivo deseado a la URL de la secuencia de comandos CF, p.

/pdf.cfm/myreport

El plugin usará lo que viene después de la barra final como el "Guardar como ..." nombre.

+0

URL re-escritura no es una opción para este proyecto en particular, pero esto es una buena información a tener en el futuro. – ale

+0

Resulta que no necesita reescritura de URL: basta con agregar una barra y basta con el nombre de archivo elegido para la URL del script. Ver respuesta actualizada. – CfSimplicity

-1

Usaría el atributo name de la etiqueta cfdocument que almacenará los contenidos en una variable. Luego use las etiquetas cfheader y cfcontent como lo ha hecho anteriormente, con la excepción de reemplazar "en línea"; con adjunto;"

utilizo código como este:

<cfdocument name="pdf"> ... </cfdocument> 
<cfheader name="Content-Disposition" value="attachment;filename=MyReport.pdf;" /> 
<cfcontent type="application/pdf" variable="#pdf#" /> 
3

Asegúrese de utilizar ATTACHMENT y no INLINE.

IE NO le gusta INLINE y abrirá un documento de Word como READ ONLY y no asumirá el nombre de archivo que le proporcione.

Ejemplo:

<cfheader name="content-disposition" value="attachment; filename=#filename#.doc" charset="utf-8"> 

NO

<cfheader name="content-disposition" value="inline; filename=#filename#.doc" charset="utf-8"> 
Cuestiones relacionadas