2012-07-18 14 views
5

Sto provando a creare dinamicamente un PDF in linea che, quando l'utente sceglie di salvarlo, richiede il mio nome file personalizzato. Secondo the documentation, l'attributo saveasname dovrebbe fare ciò che voglio.Content-disposition ignorata in IE 9 e Firefox 13

(solo formato "PDF") Il nome file visualizzato nella finestra di dialogo Salva con nome quando un utente salva un file PDF scritto nel browser.

Tuttavia, ciò che sta accadendo sia in IE 9 e in Firefox 13.0.1 è che il nome del file che appare nella finestra di dialogo Salva con nome è lo stesso che il mio modello CF, ma con estensione PDF. (In altre parole, il mio codice è makepdf.cfm e SaveAs mi chiede di salvare makepdf.pdf.) In Chrome, tuttavia, funziona perfettamente. (Tutto su Windows 7.)

Ecco il mio codice per creare il PDF:

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

Se io dichiaro esplicitamente la disposizione dei contenuti e tipo di contenuto, in questo modo

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf"> 
<cfcontent type="application/x-pdf"> 
<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf"> 
  • Chrome mi dice che "Content-Disposition" è stato dichiarato due volte
  • Firefox mi dice che il file PDF è corrotto
  • IE semplicemente lo ignora (e ancora non mostra il nome del file a destra)

Se mi baso solo sulla testata

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

ottengo lo stesso comportamento come il primo frammento di codice.

So come ottenere il browser per richiedere il download anziché visualizzare in linea e tutto funziona come previsto, ma non è il comportamento desiderato.

Ho bisogno di usare orari e date nei nomi dei file e gli utenti finali non sono abbastanza esperti da evitare di sovrascrivere i loro file (dovrebbero scegliere di salvarli).

C'è qualcosa che mi manca che farà sì che IE e Firefox facciano quello che dovrebbero? Quali altri browser lo faranno? Safari mobile?

risposta

2

Il problema sembra essere che "nomefile = xxx" è stato veramente destinato per la disposizione "allegato", e non tutti i plugin del browser PDF riconoscono come un meccanismo di per specificare la riga "salva come", come hai scoperto.

Un approccio diverso per far sì che tutti usino il nome file preferito consiste nel manipolare l'URL utilizzando le regole di riscrittura dei server Web. Come semplice esempio avresti il ​​tuo script per generare i pdf e servirli in linea: pdf.CFM

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

quindi creare una regola di riscrittura, che corrisponde gli URL nella forma /pdf/MyFileName e li passa a pdf.cfm. Su IIS7 questo potrebbe essere:

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

Questo corrisponderà ai nomi di file contenenti solo caratteri alfanumerici, trattini di sottolineatura e trattino. Non si desidera consentire spazi o caratteri di nome file non validi.

Quando si accede /pdf/MyReport il PDF verrà visualizzato in linea dal plugin, e quando lo si salva, il nome del file di default sarà myreport.pdf.

Se si utilizza un framework che supporta gli URL sicuri del motore di ricerca o "percorsi", è possibile fare lo stesso senza la necessità di riscrivere il server Web.

AGGIORNAMENTO: In realtà non è necessario utilizzare la riscrittura degli URL: è sufficiente aggiungere una barra in avanti e il nome file desiderato all'URL dello script CF, ad es.

/pdf.cfm/myreport

Il plugin utilizzerà ciò che viene dopo la barra finale come "Save As ..." nome.

+0

URL ri-scrittura non è un'opzione per questo particolare progetto, ma questo è un po 'di buone informazioni per avere per il futuro. – ale

+0

Si scopre che non è necessario riscrivere URL: è sufficiente aggiungere una barra e il nome file scelto all'URL dello script è sufficiente. Vedi risposta aggiornata. – CfSimplicity

-1

Vorrei utilizzare l'attributo del tag cfdocument che memorizzerà il contenuto in una variabile. Quindi utilizza i tag cfheader e cfcontent come sopra, ad eccezione della sostituzione di "inline"; con "allegato"

io uso il codice come questo:

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

Assicurarsi di utilizzare ATTACHMENT e non INLINE.

IE non mi piace INLINE e aprirà un documento word come SOLO LETTURA oltre a non assumere il nome file che gli viene dato.

Esempio:

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

NON

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