我正在尝试动态创建内联PDF,当用户选择保存时,会提示我的自定义文件名。根据{{3}},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">
如果我明确声明了内容处理和内容类型,就像这样
<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf">
<cfcontent type="application/x-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">
我得到与第一段代码相同的行为。
我知道如何让浏览器提示下载而不是显示内联,然后一切都按预期工作,但这不是理想的行为。
我需要在文件名中使用时间和日期,最终用户不够精明,不能覆盖他们的文件(如果他们选择保存文件)。
是否有一些我错过的东西会让IE和Firefox做他们应该做的事情?其他什么浏览器会这样做?移动Safari?
答案 0 :(得分: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 。< / p>
如果您使用的是支持搜索引擎安全URL或“路由”的框架,您可以执行相同操作而无需重写Web服务器。
更新:实际上你不需要使用URL重写:只需在CF脚本URL中附加正斜杠,然后附加所需的文件名,例如
<强> /pdf.cfm/myreport 强>
该插件将使用最终斜杠之后的任何内容作为“另存为...”名称。
答案 1 :(得分:3)
确保使用ATTACHMENT而不是INLINE。
IE不喜欢INLINE,并且会打开word文档作为READ ONLY,并且不会假设您提供的文件名。
示例:
<cfheader name="content-disposition" value="attachment; filename=#filename#.doc" charset="utf-8">
不是
<cfheader name="content-disposition" value="inline; filename=#filename#.doc" charset="utf-8">
答案 2 :(得分:0)
我会使用name
标记的cfdocument
属性,该属性会将内容存储在变量中。然后使用上面的cfheader
和cfcontent
标记,但替换“inline”除外与“附件;”
我使用这样的代码:
<cfdocument name="pdf"> ... </cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=MyReport.pdf;" />
<cfcontent type="application/pdf" variable="#pdf#" />