phpMailer附件

| 将文件上传到我的服务器后,我使用它来将文件附加到邮件中:
for ($i = 0; $i <= 2; $i++)
{
    $mail->AddAttachment($locatie.$_FILES[\'uploaded\'.$i][\'name\'], $_FILES[\'uploaded\'.$i][\'name\']);
}
添加附件是可选的,但是如果没有文件上传,则会出现错误:无法访问文件 如何防止显示此错误?     
已邀请:
        请先在这里查看如何处理文件上传: 处理文件上传 您需要引用临时文件名。这是获取实际文件名所需的,而不仅仅是文件名。
$_FILES[\'userfile\'][\'tmp_name\']
因此,访问
$_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)
      ;
}
注意事项 您的代码将两个作业相互混合。这使您难以调试和改进-并且很难处理文件/系统问题和安全性。 我建议您采取一些不同的方法:一个接一个地执行。在您的情况下,即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;
    }        
}
如果该部分已经存在错误,则说明它与文件上载过程有关。这是未经测试的代码,因此仅说明方向。 然后,在第二步中,您可以遍历这样的数组并添加附件:
foreach($validAttachments as $attachment)
{
    $mail->AddAttachment($attachment->filePath, $attachment->fileName);
}
然后,您可以更好地检查不同部分中的错误,而无需将一个问题与另一个问题混在一起。     
        在添加附件之前,您应该检查上传的文件是否存在,例如与
fopen
。     
        解
for ($i = 0; $i <= 2; $i++)
{
    if (file_exists($locatie.$_FILES[\'uploaded\'.$i][\'tmp_name\'])) {
        $mail->AddAttachment($locatie.$_FILES[\'uploaded\'.$i][\'tmp_name\'], $_FILES[\'uploaded\'.$i][\'name\']);
    }
}
更新资料 您使用的是
$locatie.$_FILES[\'uploaded\'.$i][\'name\']
而不是
$locatie.$_FILES[\'uploaded\'.$i][\'tmp_name\']
作为要加载的文件。上传文件后,它将使用临时名称重命名并放置在临时文件夹中。那就是获得它的地方,这就是为什么需要用ѭ10引用它的原因。     
        我已经能够使用计数器解决此问题:
$locatie = \'uploads/\';
$upload_count = -1;

    for ($i = 0; $i <= 2; $i++)
    {
        if($_FILES[\'uploaded\'.$i][\'type\'] != \'application/octet-stream\')  // Geen php files
        {
            $folder = $locatie.basename($_FILES[\'uploaded\'.$i][\'name\']) ;           
            if(move_uploaded_file($_FILES[\'uploaded\'.$i][\'tmp_name\'], $folder))
            {
                $upload_count ++;
            }
        }
附件循环:
for ($i = 0; $i <= $upload_count; $i++)
{
    $mail->AddAttachment($locatie.$_FILES[\'uploaded\'.$i][\'name\'], $_FILES[\'uploaded\'.$i][\'name\']);
}
    
        同意@patapizza,但是在检查文件系统之前(无论如何应该这样做),还可以像检查$ _FILES一样
for ($i = 0; $i < count($_FILES); $i++){
    // only iterate over the number of files you actually have
}
    
        在添加附件之前,您需要检查该文件是否实际上传/存在。就像是
for ($i = 0; $i <= 2; $i++)
{
    if (file_exists($locatie.$_FILES[\'uploaded\'.$i][\'tmp_name\'])) {
        $mail->AddAttachment($locatie.$_FILES[\'uploaded\'.$i][\'tmp_name\'], $_FILES[\'uploaded\'.$i][\'name\']);
    }
}
    
        不知道这是否完全符合您的要求,但这就是我附加多个上传文件并保留Web表单中原始文件名的方式。用户的错误处理/消息传递不会给UPLOAD_ERR_NO_FILE错误,因为文件上传是可选字段,但仍会处理foreach循环中的每个输入字段。
foreach ($_FILES[\"userfile\"][\"error\"] as $key => $error) 
    {
      if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES[\"userfile\"][\"tmp_name\"][$key];
        $name = $_FILES[\"userfile\"][\"name\"][$key];
        $mailer->AddAttachment($tmp_name, $name);
        }

      $name = $_FILES[\"userfile\"][\"name\"][$key];
      switch($error){
      case UPLOAD_ERR_INI_SIZE: echo $errmsg1.$name.$errmsg2;
break;
      case UPLOAD_ERR_FORM_SIZE: echo $errmsg1.$name.$errmsg2;
break;     
      case UPLOAD_ERR_PARTIAL:  echo $errmsg1.$name.$errmsg2; 
break;
      case UPLOAD_ERR_NO_FILE: 
      break; 
      case UPLOAD_ERR_NO_TMP_DIR: echo $errmsg1.$name.$errmsg2;
break; 
      case UPLOAD_ERR_CANT_WRITE: echo $errmsg1.$name.$errmsg2;
break;
      case UPLOAD_ERR_EXTENSION: echo $errmsg1.$name.$errmsg2;
break;
      } 
}
    

要回复问题请先登录注册