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

ale*_*ale 5 coldfusion cfdocument coldfusion-9

我正在尝试动态创建一个内联PDF,当用户选择保存它时,会提示我的自定义文件名.根据文档,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">
Run Code Online (Sandbox Code Playgroud)

如果我明确声明内容配置和内容类型,就像这样

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf">
<cfcontent type="application/x-pdf">
<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf">
Run Code Online (Sandbox Code Playgroud)
  • Chrome告诉我,"Content-Disposition"已经宣布两次
  • Firefox告诉我PDF文件已损坏
  • IE只是忽略它(仍然没有显示正确的文件名)

如果我只是依靠标题

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf">
<cfcontent type="application/x-pdf">
<cfdocument format="pdf" bookmark="true">
Run Code Online (Sandbox Code Playgroud)

我得到的行为与第一段代码相同.

我知道如何让浏览器提示下载而不是显示内联,然后一切按预期工作,但这不是理想的行为.

我需要在文件名中使用时间和日期,并且最终用户不够精明,不能覆盖他们的文件(如果他们选择保存它们).

有什么我想念的东西会让IE和Firefox做他们应该做的事情吗?其他什么浏览器会这样做?移动Safari?

CfS*_*ity 3

问题似乎是“filename=xxx”实际上是用于“附件”配置的,并且并非所有浏览器 PDF 插件都将其识别为指定内联“另存为”的机制,正如您所发现的。

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

<cfheader name="Content-Disposition" value="inline">
<cfdocument format="PDF" mimetype="application/pdf">Test</cfdocument>
Run Code Online (Sandbox Code Playgroud)

然后创建一个重写规则,该规则匹配/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>
Run Code Online (Sandbox Code Playgroud)

这将匹配仅包含字母数字、下划线和连字符的文件名。您不想允许空格或无效的文件名字符。

当您访问/pdf/myreport时,插件将内联显示 PDF,当您保存它时,默认文件名将为myreport.pdf

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

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

/pdf.cfm/myreport

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