我想动态创建一个在线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浏览器?
这个问题似乎是“文件名= 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
该插件将使用的“另存为...”名称最后的斜杠之后无论发生什么事。
确保你使用的附件,而不是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">
我会使用name
的属性cfdocument
将内容存储在一个变量标签。 然后使用cfheader
和cfcontent
的标签,你有以上更换除外“内联”; 用“附件;”
我用这样的代码:
<cfdocument name="pdf"> ... </cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=MyReport.pdf;" />
<cfcontent type="application/pdf" variable="#pdf#" />