phpMailer附件

phpMailer附件,php,attachment,phpmailer,Php,Attachment,Phpmailer,在将文件上载到我的服务器后,我使用此功能将文件附加到邮件: for ($i = 0; $i <= 2; $i++) { $mail->AddAttachment($locatie.$_FILES['uploaded'.$i]['name'], $_FILES['uploaded'.$i]['name']); } for($i=0;$i添加附件($locatie.$\u文件['upload'.$i]['name'],$\u文件['upload'.$i]['name']); }

在将文件上载到我的服务器后,我使用此功能将文件附加到邮件:

for ($i = 0; $i <= 2; $i++)
{
    $mail->AddAttachment($locatie.$_FILES['uploaded'.$i]['name'], $_FILES['uploaded'.$i]['name']);
}
for($i=0;$i添加附件($locatie.$\u文件['upload'.$i]['name'],$\u文件['upload'.$i]['name']);
}
添加附件是可选的,但如果没有上载文件,则会出现错误:无法访问文件


如何防止显示此错误?

在添加附件之前,您应该检查上传的文件是否存在,例如,使用
fopen

解决方案
for($i=0;$i添加附件($locatie.$\u文件['uploaded'.$i]['tmp\u name'],$\u文件['uploaded'.$i]['name']);
}
}
更新
您使用的是
$locatie.$\u文件['uploaded'.$i]['name']
而不是
$locatie.$\u文件['uploaded'.$i]['tmp\u name']
作为要加载的文件。上载文件时,将使用临时名称重命名该文件,并将其放置在临时文件夹中。这就是您将获取该文件的地方,这就是为什么您需要使用
$locatie.$\u FILES['uploaded'.$i]['tmp\u name'].
在检查文件系统之前,先使用@patapizza对其进行引用的原因(无论如何,您应该这样做),您也可以只检查$\u文件,如

for ($i = 0; $i < count($_FILES); $i++){
    // only iterate over the number of files you actually have
}
for($i=0;$i
在添加附件之前,您需要检查该文件是否已实际上载/存在

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']);
    }
}
for($i=0;$i添加附件($locatie.$\u文件['uploaded'.$i]['tmp\u name'],$\u文件['uploaded'.$i]['name']);
}
}

请首先查看如何处理文件上载:

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

$_FILES['userfile']['tmp_name']
因此,访问
$\u FILES['userfile']['name']
获取附件的书面文件名,访问
$\u FILES['userfile']['tmp\u 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)
      ;
}
如果该部分中已经存在错误,那么您知道它与文件上载过程有关。这是未经测试的代码,因此仅说明一个方向

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

foreach($validAttachments as $attachment)
{
    $mail->AddAttachment($attachment->filePath, $attachment->fileName);
}

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

我已经能够使用计数器解决此问题:

$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 ++;
            }
        }
$locatie='uploads/';
$upload_count=-1;

对于($i=0;$i不确定这是否完全符合您的要求,但这就是我附加多个上载文件并从网络表单保留原始文件名的方式。用户的错误处理/消息传递不会给出上载错误。\u ERR\u NO\u文件的错误,因为文件上载是可选字段,但仍会处理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;
      } 
}

如果只有一个上传的文件要附加怎么办?很抱歉,我没有说得更准确,但是你的for循环显然应该只在你拥有的项目上进行迭代。我会相应地更新答案。你能更新问题并显示到目前为止你拥有的完整代码吗?@konsolenfreddy查看我在本主题中添加的解决方案。我尝试了if(file_存在($locatie.$_FILES['upload'.$i]['name'])但仍然存在错误。
$locatie
代表什么?@hakre$locatie='uploads/';您是否将上载的文件移到那里或它们仍然在临时上载文件夹中?查看hakre答案--尝试
$locatie.$_FILES['uploaded'.$i]['tmp_name']
。我已经更新了答案——请检查。无论如何——看看你是否还没有更新。抱歉,无意中编辑了你的答案,把事情弄得一团糟。/@Shef,别担心,声誉低于2000,你的编辑会进入建议编辑队列。即使已经提交,也可以将帖子回滚到更早的版本版本.:)我已将此应用于我的脚本,但它会使服务器过载。我已将此添加到上载部分的循环中:$temp\u name.$I=$$\u FILES['uploaded.$I]['tmp\u name'];然后用于附件if(is\u uploaded\u file($temp\u name.$I))Muiter,这样做:首先重写文件上传部分的脚本。PHP内置支持多个文件上传,检查手册如何做得更好。然后在获得所有有效文件的列表(并且验证了程序流)之后,然后您可以轻松添加附件。我添加了更多示例代码,以更好地说明我的最后一条评论。希望这有助于,我知道当自己陷入困境时,有时会很困难。干得好@hakre,这对我来说是一个新的挑战!
$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']);
}
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;
      } 
}