Добавление нескольких вложений в PHPMailer

Я пытаюсь прикрепить несколько изображений во вложениях. Я использовал forearch для каждого вложения, но при использовании foreach он не получает имя и имя tempname, вероятно, я делаю что-то не так. Ниже приведен код и ошибки:

Ввод HTML

<input id="upload-file" class="upload-file" type="file" name="upload-file[]">

var_dump из $_FILES['upload-file']:

array(5) { ["name"]=> array(1) { [0]=> string(47) "WRANGLER_AW13_GIRLONTOP_A4_LANDSCAPE_300dpi.jpg" } ["type"]=> array(1) { [0]=> string(10) "image/jpeg" } ["tmp_name"]=> array(1) { [0]=> string(24) "C:\xampp\tmp\php41DC.tmp" } ["error"]=> array(1) { [0]=> int(0) } ["size"]=> array(1) { [0]=> int(91742) } } 

var_dump для имени и temp_name:

Notice: Undefined index: name in C:\xampp\htdocs\hmg\process-email.php on line 66

Notice: Undefined index: tmp_name in C:\xampp\htdocs\hmg\process-email.php on line 67

NULL 
NULL

КОД:

foreach($_FILES['upload-file'] as $file) {         

    $name = $file['name'];
    $path = $file['tmp_name'];
    var_dump($name);
    var_dump($path);

    //And attach it using attachment method of PHPmailer.

    $mail->addattachment($path,$name);
}

person Fahad Sohail    schedule 13.03.2015    source источник
comment
Имейте в виду, что ни один из представленных ответов не обрабатывает загрузку безопасно, как указано в документах PHP< /а>. Основывайте свой код на примерах загрузки файлов, поставляемых с PHPMailer, которые обрабатывают файлы правильно.   -  person Synchro    schedule 05.05.2016
comment
Тем временем мой PHP действительно заржавел, но как этот пример больше безопасно? Он просто создает временный файл, который у нас уже есть? Даже если я не вижу какого-то улучшения, я бы назвал это обработкой ошибок, но не безопасным. Говоря о безопасности, нам нужно убедиться, что временные файлы не могут быть выполнены из-за неправильной настройки сервера, предотвращения ретрансляции спама (капча или что-то в этом роде) и т. д. @Synchro   -  person Christian Gollhardt    schedule 17.10.2018
comment
Это безопаснее, поскольку гарантирует, что временный файл был создан PHP, а не внедрен из какого-либо другого источника. Посмотрите документы для move_uploaded_file для получения дополнительной информации; об этом есть целая глава в документации по PHP.   -  person Synchro    schedule 17.10.2018


Ответы (3)


Добро пожаловать на злую сторону PHP. $_FILES это не то, что ожидает разработчик.

//wrong code
$img1 = $_FILES['upload-file'][0]['tmp_name'];
$img2 = $_FILES['upload-file'][1]['tmp_name'];

//working code
$img1 = $_FILES['upload-file']['tmp_name'][0];
$img2 = $_FILES['upload-file']['tmp_name'][1];

Итак, вам нужно что-то вроде

$totalFiles = count($_FILES['upload-file']['tmp_name']);
for ($i = 0; $i < $totalFiles; $i++) {
   $name = $_FILES['upload-file']['name'][$i];
   $path = $_FILES['upload-file']['tmp_name'][$i];
   $mail->addattachment($path,$name);
}

Вот пример из репозитория PHPMailer.

person Christian Gollhardt    schedule 13.03.2015

Спасибо за ответы на все вопросы. Я уверен, что все ваши подходы будут работать нормально, но я решил решить эту проблему сам. Этот код решил проблему

$validAttachments = array();

foreach($_FILES['upload-file']['name'] as $index => $fileName) {
    $filePath = $_FILES['upload-file']['tmp_name'][$index];
    $validAttachments[] = array($filePath, $fileName);              
}

foreach($validAttachments as $attachment) {
    $mail->AddAttachment($attachment[0], $attachment[1]);
}

Я надеюсь, что любой, у кого есть такая же проблема, получит помощь здесь ...

person Fahad Sohail    schedule 14.03.2015

Большинство решений здесь основаны на формах.

Поэтому я придумал простое решение, если вы хотите прикрепить все файлы из определенного каталога.

$file_to_attach_directory = 'files/';
if ($handle = opendir($file_to_attach_directory)) {
    try {
        while (false !== ($entry = readdir($handle))) {
            $attachment_location = $file_to_attach_directory. $entry;
            $mail->addAttachment($attachment_location);
        }
        closedir($handle);
        // Send Mail
        if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
        } else {
            echo "Message sent!";
        }
    } catch (Exception $e) {
        var_dump($e);
    }
}
person Shirshandu Bhattacharjee    schedule 24.06.2016