内容处置在IE 9和Firefox 13被忽略(Content-disposition being

2019-09-19 17:30发布

我想动态创建一个在线PDF,当用户选择保存它,用我的自定义文件名提示。 根据该文件 ,在saveasname属性应该做我想做的。

(格式=“PDF”仅)出现在当用户保存写入到浏览器PDF文件另存为对话框的文件名。

但是,什么是在IE 9和Firefox中13.0.1发生的是出现在另存为对话框中的文件名相同,我的CF模板,但用PDF扩展名。 (换句话说,我的代码是在makepdf.cfm和另存为提示我保存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的告诉我说:“内容处置”已申报两次
  • 火狐告诉我的PDF文件已损坏
  • IE浏览器会忽略它(仍然没有显示正确的文件名)

如果我只是靠头

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

我得到相同的行为的代码的第一个片段。

我知道如何让浏览器提示下载而不是在线显示,一切工作正常的话,但是这不是期望的行为。

我需要使用的时间和日期在文件名和最终用户都不够精明,从覆盖他们的文件保留(如果他们选择拯救他们)。

是否有什么我失踪,将让IE和Firefox做他们应该是什么? 什么其他的浏览器要做到这一点? 移动Safari浏览器?

Answer 1:

这个问题似乎是“文件名= 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重写:简单地追加一个斜杠,然后将所需的文件名到CF脚本URL,例如

/pdf.cfm/myreport

该插件将使用的“另存为...”名称最后的斜杠之后无论发生什么事。



Answer 2:

确保你使用的附件,而不是INLINE。

IE不喜欢INLINE,将打开一个word文档为只读以及不假设你给它的文件名。

例:

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

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


Answer 3:

我会使用name的属性cfdocument将内容存储在一个变量标签。 然后使用cfheadercfcontent的标签,你有以上更换除外“内联”; 用“附件;”

我用这样的代码:

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


文章来源: Content-disposition being ignored in IE 9 and Firefox 13