先看这里如何处理文件上传:
Handling file uploads
您需要参考临时文件名。这是获取实际文件名所必需的,而不仅仅是文件名。
$_FILES['userfile']['tmp_name']
所以访问$_FILES['userfile']['name']获取附件的书面文件名和$_FILES['userfile']['tmp_name']指定上传的实际文件(数据)。
大致放入您的代码中,incl. a validation 您也应该验证它实际上是文件上传:
for ($i = 0; $i <= 2; $i++)
{
# ignore file that have not been uploaded
if (empty($_FILES['uploaded'.$i])) continue;
# get the data of the file
$fileName = $_FILES['uploaded'.$i]['name'];
$filePath = $_FILES['uploaded'.$i]['tmpname'];
# add only if the file is an upload
is_uploaded_file($filePath)
&& $mail->AddAttachment($filePath, $fileName)
;
}
注意事项
您的代码将两个工作混合在一起。这让您难以调试和改进 - 以及处理文件/系统问题和安全性等问题。
我建议您采用一种不同的方法:一步一步地做。在您的情况下,即 1.) 处理文件上传并收集您需要的数据,2.) 添加这些附件。
您可以通过查看 PHP 手册来改进第一部分。如果你想支持多个文件的上传,我建议你定位于页面Uploading multiple files给出的建议。然后处理文件上传并形成一个数组,其中包含客户端计算机上的文件名和服务器系统上每个条目的路径。
// see PHP Manual for multi file uploads, this is based on it
$validAttachments = array();
foreach($_FILES['userfile']['name'] as $index => $fileName)
{
$filePath = $_FILES['userfile']['tmp_name'][$index];
if(is_uploaded_file($filePath))
{
$attachment = new stdClass;
$attachment->fileName = $fileName;
$attachment->filePath = $filePath;
$validAttachments[] = $attachment;
}
}
如果该部分已经有错误,您知道它与文件上传过程有关。这是未经测试的代码,所以只是说明一个方向。
在第二步中,您可以遍历这样的数组并添加附件:
foreach($validAttachments as $attachment)
{
$mail->AddAttachment($attachment->filePath, $attachment->fileName);
}
然后,您可以更好地检查不同部分中的错误,而不会将一个问题与另一个问题混为一谈。