在ColdFusion应用程序中,我需要让用户将电子表格保存到硬盘中。
我已经能够动态生成文件,方法是将它们构建为XML或HTML表格,应用application/vnd.ms-excel
MIME类型,并使用.xls
扩展名保存它们。
<cfheader name="Content-Disposition" value="attachment; filename=MySpreadsheet.xls">
<cfcontent type="application/vnd.ms-excel">
但是当用户加载这样的文件时,他们总是会收到恼人的消息(由于Excel's Extension Hardening Feature):
您尝试打开的文件&#39; _____。xls&#39;,格式与文件扩展名指定的格式不同。在打开文件之前,请验证文件是否已损坏且是否来自受信任的源。你想现在打开文件吗?
我宁愿避免这条消息。
我理解<cfspreadsheet>
标记和SpreadsheetWrite()
函数会生成一个不显示此消息的正确Excel文件 - 但它们都需要一个参数来指示服务器上文件的写入位置。因为下载可能包含敏感信息,并且因为一旦将文件写入服务器后我就无法轻松实施安全性,所以我不想创建这样的文件 - 即使是暂时的。 (我知道我可以提供密码,但这不是生成Excel文件后将使用的业务流程环境中的理想解决方案。)
如何生成Excel文件并提示下载而不首先将其写入文件?
答案 0 :(得分:6)
在为此问题搜索Stack Overflow和其他资源之后,我终于在另一个问题的上下文中找到了解决方案。我现在在这里发布问题和我的发现,希望其他人比我更容易找到这些信息。
解决方案围绕SpreadsheetReadBinary()
标记中的variable
函数和<cfcontent>
属性。
我使用ColdFusion spreadsheet functions构建了一个电子表格,然后将以下内容放在文件的 end 上(这与我放置<cfheader>
和{{1}的习惯相反在开头)。
<cfcontent>
如果有人会从更多细节中受益,<cfheader name="Content-Disposition" value="attachment; filename=MySpreadsheet.xls">
<cfcontent type="application/vnd.ms-excel" variable="#SpreadsheetReadBinary( objSpreadsheet )#">
文件中的以下内容将构建电子表格并提示下载为正确格式的Excel文件:
.cfm