7

我有一个带有文件输入的表单:

<input type="file" id="uploadFile" name="uploadFile" />

我使用JQuery 表单插件的 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>

但是,这无法正常工作 - 未发送电子邮件。我究竟做错了什么?

4

1 回答 1

9

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 的建议进行操作 - 将其作为带有 mailpart(base64 编码)的二进制文件放入消息的主体中。因此,当后台处理程序服务开始尝试打开并附加此文件时,该文件早已不复存在,因为请求已经结束。我还认为该文件在此临时目录中以“.tmp”扩展名存在 - 这显然不是您想要附加的(但这可能是 CF 的先前版本)。

要修复它,首先使用带有“上传”操作的 cffile 将文件放入磁盘上的真实(而不是临时)文件夹中。然后使用 cfmailparam 附加文件。注意:设置为 yes 的“remove”属性将导致 CF 在成功发送邮件后删除文件 - 我相信这是您正在寻找的效果。

于 2012-07-03T13:20:28.620 回答