我有一个带有文件输入的表单:
<input type="file" id="uploadFile" name="uploadFile" />
我使用 JQuery form plugin 的 ajaxForm 方法提交表单.
然后,在处理帖子的代码中,我读取并处理文件。我使用 cfspreadsheet 直接从文件输入字段读取文件:
<cfspreadsheet
action="read"
src="#form.uploadFile#"
sheet="1"
query="spreadsheetData"
headerRow="1"
excludeHeaderRow="true"
>
这一切正常。
我决定也想将电子表格通过电子邮件发送给管理员。我以为我可以简单地使用包含以下 cfmailparam 标记的 cfmail 标记来完成此操作:
<cfmail to="myEmailAddress@email.com"
from="fromEmail@email.com"
subject="Upload File" type="HTML">
<cfmailparam file="#form.uploadFile#" />
File processed successfully
</cfmail>
但是,这无法正常工作 - 未发送电子邮件。我究竟做错了什么?
最佳答案
Leigh 的解决方案运行良好,您可能已经在代码中实现了。我想我会把我的 0.02 美分放在为什么这是一个问题的开头。
当您上传文件时,该文件被放置在临时文件夹位置。如果您对文件不做任何处理以将其放入最终目的地,则该文件将被删除 - 可能在您的请求结束时。
同时, cfmailparam 实际上并没有在运行时附加文件。它将它留给假脱机进程来做到这一点。如果您查看 ColdFusion 安装的“mail/spool”目录,您将看到一个扩展名为 .cfmail 的文件。如果您在交付前无法“捕获”一个,请检查您无法交付的文件夹 - 肯定会有一些在那里闲逛。
.cfmail 文件用作发送邮件的假脱机服务的指令。它有主题、发件人、收件人、服务器地址、正文等。
如果您附加一个文件,您将在该文件的底部看到如下所示的内容:
file: D:\jrun\temp\blah.tmp
file-type: application/octet-stream; name="I am the file you uploaded.tmp"
file-disposition: attachment
remove: false
在运行时 CF 抓取这个文件并执行 Leigh 的建议 - 将它作为带有邮件部分(base64 编码)的二进制文件放入消息的主体中。所以发生的事情是,当假脱机服务开始尝试打开并附加此文件时,该文件早已消失,因为请求已结束。我还认为该文件在这个临时目录中以“.tmp”扩展名存在 - 这显然不是您想要附加的(但这可能是以前版本的 CF)。
要修复它,首先使用 cffile 和“上传”操作将文件放在磁盘上的真实(而不是临时)文件夹中。然后使用 cfmailparam 附加文件。注意:“remove”属性设置为 yes 将导致 CF 在成功发送邮件后删除文件 - 我相信这是您正在寻找的效果。
关于file-upload - 为什么我不能将上传的文件附加到电子邮件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301236/