在IE 9和Firefox 13中忽略内容处置

时间:2012-07-18 17:56:34

标签: coldfusion coldfusion-9 cfdocument

我正在尝试动态创建内联PDF,当用户选择保存时,会提示我的自定义文件名。根据{{​​3}},saveasname属性应该按照我的意愿行事。

  

(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">
  • Chrome告诉我“内容处置”已宣布两次
  • 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?

3 个答案:

答案 0 :(得分:3)

问题似乎是“filename = xxx”真正用于“附件”处理,并不是所有的浏览器PDF插件都将其识别为指定内联“另存为”的机制,正如您所发现的那样

让它们全部使用您的首选文件名的另一种方法是使用Web服务器重写规则来操作URL。举个简单的例子,您可以使用脚本生成pdf并以内联方式提供它们: pdf.cfm

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

然后创建一个重写规则,该规则匹配 / pdf / myfilename 形式的URL,并将它们传递给 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 。< / p>

如果您使用的是支持搜索引擎安全URL或“路由”的框架,您可以执行相同操作而无需重写Web服务器。

更新:实际上你不需要使用URL重写:只需在CF脚本URL中附加正斜杠,然后附加所需的文件名,例如

<强> /pdf.cfm/myreport

该插件将使用最终斜杠之后的任何内容作为“另存为...”名称。

答案 1 :(得分: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">

答案 2 :(得分:0)

我会使用name标记的cfdocument属性,该属性会将内容存储在变量中。然后使用上面的cfheadercfcontent标记,但替换“inline”除外与“附件;”

我使用这样的代码:

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