Coldfusion IE 9和Firefox 13中忽略的内容配置
我试图动态创建一个内联PDF,当用户选择保存它时,它会提示使用我的自定义文件名。根据,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),但是,它工作得非常好。(全
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">