Coldfusion IE 9和Firefox 13中忽略的内容配置

Coldfusion IE 9和Firefox 13中忽略的内容配置,coldfusion,coldfusion-9,cfdocument,Coldfusion,Coldfusion 9,Cfdocument,我试图动态创建一个内联PDF,当用户选择保存它时,它会提示使用我的自定义文件名。根据,saveasname属性应该满足我的要求 (format=“PDF”only)当用户保存写入浏览器的PDF文件时,“另存为”对话框中显示的文件名 然而,IE 9和Firefox 13.0.1中出现的情况是,SaveAs对话框中显示的文件名与我的CF模板相同,但扩展名为PDF。(换句话说,我的代码是在Chrome中的makepdf.cfm,SaveAs提示我保存makepdf.pdf),但是,它工作得非常好。(全

我试图动态创建一个内联PDF,当用户选择保存它时,它会提示使用我的自定义文件名。根据,
saveasname
属性应该满足我的要求

(format=“PDF”only)当用户保存写入浏览器的PDF文件时,“另存为”对话框中显示的文件名

然而,IE 9和Firefox 13.0.1中出现的情况是,SaveAs对话框中显示的文件名与我的CF模板相同,但扩展名为PDF。(换句话说,我的代码是在Chrome中的
makepdf.cfm
,SaveAs提示我保存
makepdf.pdf
),但是,它工作得非常好。(全部在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做他们应该做的?其他哪些浏览器会这样做?Mobile Safari?

我将使用
cfdocument
标记的
name
属性,该属性将内容存储在变量中。然后使用上面的
cfheader
cfcontent
标记,但将“inline;”替换为“attachment;”

我使用的代码如下:

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

问题似乎在于“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

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

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

/pdf.cfm/myreport


插件将使用最后一个斜杠后面的任何内容作为“另存为…”名称。

确保使用附件而不是内联

IE不喜欢内联,它将以只读方式打开word文档,并且不使用您提供的文件名

例如:

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

不是



URL重写不是这个特定项目的选项,但这是一些很好的未来信息。事实证明,您不需要重新编写URL—只需在脚本URL中添加斜杠和您选择的文件名就足够了。请参阅更新的答案。
<cfheader name="content-disposition" value="inline; filename=#filename#.doc" charset="utf-8">