2012-07-18 58 views
5

我想動態創建一個內聯PDF,當用戶選擇保存它時,用我的自定義文件名提示。根據the documentationsaveasname屬性應該做我想要的。在IE 9和Firefox中被忽略的內容處置13

(format =「PDF」only)當用戶保存寫入瀏覽器的PDF文件時,SaveAs對話框中出現的文件名。

但是,IE 9和Firefox 13.0.1中出現的情況是,SaveAs對話框中出現的文件名與我的CF模板相同,但帶有PDF擴展名。 (換句話說,我的代碼位於makepdf.cfm,SaveAs提示我保存makepdf.pdf。)但是,在Chrome中,它完美地工作。 (所有的在Windows 7)

這裏是我的代碼來創建PDF:

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

如果我明確地聲明內容部署和內容類型,像這樣

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf"> 
<cfcontent type="application/x-pdf"> 
<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf"> 
  • 鉻告訴我「Content-Disposition」已被宣告兩次
  • Firefox告訴我PDF文件已損壞
  • IE會忽略它(和仍然沒有顯示正確的文件名)

如果我僅僅靠頭

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

我得到相同的行爲的代碼的第一個片段。

我知道如何讓瀏覽器提示下載,而不是顯示內聯,並且一切按預期工作,但那不是預期的行爲。

我需要在文件名中使用時間和日期,並且最終用戶不夠精於避免覆蓋他們的文件(他們是否應該選擇保存文件)。

有什麼我錯過,會讓IE和Firefox做他們應該做的?其他瀏覽器會做什麼?移動Safari?

回答

2

這個問題似乎是「文件名= XXX」是真正用於「附件」配置,而不是所有的瀏覽器PDF插件認識到它作爲一個機制用於指定內聯「另存爲」,就像你發現的那樣。

讓他們全部使用您的首選文件名的另一種方法是使用Web服務器重寫規則來操作URL。作爲一個簡單的例子,您可以使用腳本來生成pdf並以內聯方式提供它們:pdf。CFM

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

然後創建相匹配的形式/PDF/mYfILEname的名稱網址,並將它們傳遞到pdf.cfm重新寫入規則。在IIS7上,這可能是:

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

這將僅匹配包含字母數字,下劃線和連字符的文件名。你不想允許空格或無效的文件名字符。

當您訪問/PDF/myreport的PDF內嵌將通過插件來顯示,而當你保存它,默認的文件名會myreport.pdf

如果您使用的是支持搜索引擎安全URL或「路由」的框架,則可以在不需要重寫Web服務器的情況下執行相同的操作。

更新:事實上,您不需要使用URL重寫:只需向CF腳本URL添加正斜槓,然後添加所需的文件名即可。

/pdf.cfm/myreport

該插件將使用最後的斜槓爲「另存爲...」名稱後無論發生什麼事。

+0

URL重寫是不是這個特殊項目的選項,但是這是一些有用的信息,以對未來。 – ale 2012-07-23 17:59:59

+0

原來你不需要URL重寫 - 只需將一個斜槓和你選擇的文件名追加到腳本URL就足夠了。查看更新的答案。 – CfSimplicity 2012-07-23 21:24:19

-1

我會使用cfdocument標記的name屬性,它將把內容存儲在一個變量中。然後像上面一樣使用cfheadercfcontent標籤,但替換「inline」;與「依戀」;

我用這樣的代碼:

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

確保您使用ATTACHMENT而不是INLINE。

IE不喜歡INLINE,並且會打開一個Word文檔作爲READ ONLY,並且不假定您給它的文件名。

例子:

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

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