Третий файл прикреплен только через phpmailer - PullRequest
1 голос
/ 17 февраля 2012

Я отправляю письмо с несколькими вложениями через phpmailer. Цикл, который я использовал для отправки нескольких вложений, - это «Сообщение, идущее с вложением», которое содержит только последний выбранный файл, а первые два или один файл не отправляются. Есть ли проблема с Loop. Пожалуйста:

     foreach($_FILES as $key => $file){
    $target_path = "uploads/";
    $target_path = $target_path .basename($file['name']);

   if(move_uploaded_file($file['tmp_name'], $target_path)) {
   echo "the file ".basename($file['name'])." has been uploaded";
   }else {
  echo "there was an error";
   }
  mail->AddAttachment($target_path);
   }

     <form id=
       "mail" name="mail" method="POST" action="<?php $PHP_SELF ?>" 
    enctype="multipart/form-data">
     <input type="file" name="uploaded" multiple="" />
    <input name="Submit1" type="submit" value="Submit"  />
    </form>

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Добавьте [] к имени поля ввода, например:

<input type="file" name="uploaded[]" multiple="" />

Каждый файл использует одно и то же имя «загружен», поэтому «загруженный» заменяется каждым последующим обрабатываемым файлом. Добавляя квадратные скобки, каждый последующий файл добавляется в «загруженный» массив. Вот массив $_FILES, который я получаю после добавления []:

Array
(
  [uploaded] => Array
    (
      [name] => Array
        (
          [0] => file4.txt
          [1] => file1.txt
          [2] => file2.txt
          [3] => file3.txt
        )

      [type] => Array
        (
          [0] => text/plain
          [1] => text/plain
          [2] => text/plain
          [3] => text/plain
        )

      [tmp_name] => Array
        (
          [0] => C:\temp\php95.tmp
          [1] => C:\temp\php96.tmp
          [2] => C:\temp\php97.tmp
          [3] => C:\temp\php98.tmp
        )

      [error] => Array
        (
          [0] => 0
          [1] => 0
          [2] => 0
          [3] => 0
        )

      [size] => Array
        (
          [0] => 7
          [1] => 2850
          [2] => 27
          [3] => 231
        )
    )
)

Индекс 0 в каждом массиве - это один файл, индекс 1, в каждом массиве - следующий файл и т. Д.


Это также, как вы получите значения нескольких флажков с тем же именем. (См. этот комментарий для примера.


Вот как можно перебирать загруженные файлы.

// first get the count of how many files are uploaded
$numFiles = count(array_filter($_FILES['uploaded']['name']));

for ($i = 0; $i < $numFiles; ++$i) {
    $target_path = 'c:/temp/' . basename($_FILES['uploaded']['name'][$i]);
    if(move_uploaded_file($_FILES['uploaded']['tmp_name'][$i], $target_path)) {
        echo "the file ".basename($_FILES['uploaded']['name'][$i])." has been uploaded<br />";
    }
}

Обратите внимание, как я использую $i в цикле for, чтобы отслеживать индекс текущего файла.

(Если вам интересно, почему я позвонил array_filter(), чтобы получить счет, похоже, что пустая запись автоматически существует, если вы не загружаете какие-либо файлы. array_filter() удаляет эту пустую / недействительную запись.)

0 голосов
/ 17 февраля 2012

Попробуйте добавить уникальный номер к каждому файлу на каждой итерации в цикле следующим образом:

$counter = 0;
foreach($_FILES as $key => $file){
    $counter++;
    $target_path = "uploads/";
    $target_path = $target_path .basename($file['name'], ".jpg") . $counter . ".jpg";



if(move_uploaded_file($file['tmp_name'], $target_path)) {
   echo "the file ".basename($file['name'])." has been uploaded";
   }else {
  echo "there was an error";
   }
  mail->AddAttachment($target_path);
   }

 <form id=
   "mail" name="mail" method="POST" action="<?php $PHP_SELF ?>" 
enctype="multipart/form-data">
 <input type="file" name="uploaded" multiple="" />
<input name="Submit1" type="submit" value="Submit"  />
...