phpMailer附件

Mui*_*ter 2 php attachment phpmailer

我将它用于将文件上传到我的服务器后将其附加到邮件中:

for ($i = 0; $i <= 2; $i++)
{
    $mail->AddAttachment($locatie.$_FILES['uploaded'.$i]['name'], $_FILES['uploaded'.$i]['name']);
}
Run Code Online (Sandbox Code Playgroud)

添加附件是可选的,但是当没有上传文件时,它会出错:无法访问文件

如何防止出现此错误?

hak*_*kre 6

请在此处查看如何首先处理文件上传:

处理文件上传

您需要引用临时文件名.这需要获取实际的文件名,而不仅仅是文件的名称.

$_FILES['userfile']['tmp_name']
Run Code Online (Sandbox Code Playgroud)

因此,访问$_FILES['userfile']['name']附件的书面文件名并$_FILES['userfile']['tmp_name']指定上载的实际文件(数据).

大致加入你的代码,包括.验证你应该做的一样好,以验证它实际上是一个文件上传:

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)
      ;
}
Run Code Online (Sandbox Code Playgroud)

提醒一句

您的代码将两个作业相互混合.这使您难以调试和改进 - 并处理文件/系统问题和安全性等问题.

我建议你采用一种不同的方法:一步一步走.在您的情况下,1.)处理文件上传并收集您需要的数据,2.)添加这些附件.

您可以通过查看PHP手册来改进第一部分.如果您想支持上传多个文件,我建议您根据上传多个文件页面中给出的建议.然后处理文件上载并形成一个数组,其中包含客户端计算机上的文件名和每个条目的服务器系统上的路径.

// 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;
    }        
}
Run Code Online (Sandbox Code Playgroud)

如果该部分中已存在错误,则表示它与文件上载过程有关.这是未经测试的代码,因此只是说明了一个方向.

在第二步中,您可以迭代这样的数组并添加附件:

foreach($validAttachments as $attachment)
{
    $mail->AddAttachment($attachment->filePath, $attachment->fileName);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以更好地检查不同部分中的错误,而不会将另一个问题混在一起.