5

我正在尝试动态创建一个内联 PDF,当用户选择保存它时,会提示我的自定义文件名。根据文档,该saveasname属性应该做我想要的。

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

但是,在 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 告诉我“Content-Disposition”已经被声明了两次
  • 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?

4

3 回答 3

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

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

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

/pdf.cfm/myreport

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

于 2012-07-23T09:12:09.940 回答
3

确保使用 ATTACHMENT 而不是 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">
于 2014-03-19T15:36:51.133 回答
0

我会使用标签的name属性,cfdocument它将内容存储在变量中。然后像上面一样使用cfheaderandcfcontent标记,除了替换“inline;”。带有“附件”;

我使用这样的代码:

<cfdocument name="pdf"> ... </cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=MyReport.pdf;" />
<cfcontent type="application/pdf" variable="#pdf#" />
于 2012-07-20T15:07:07.283 回答