2012-02-17 3 views
1

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

 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> 
+0

Если вы проверите каталог uploads/после этого, сколько файлов есть? Если есть только 1, возможно, вы перезаписываете первый файл в каждом последовательном цикле. Если все три есть ... ну ... это еще одна проблема. – itsmequinn

+0

Имеется только один файл. Как я могу решить эту проблему перезаписи .. Пожалуйста, сообщите –

ответ

1

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

<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 
     ) 
    ) 
) 

Index 0 в каждом массиве один файл, индекс 1 в каждом массиве является следующим файлом, и так далее.


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


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

// 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() удаляет этот пустой/недействительный ry.)

+0

Предупреждение: basename() ожидает, что параметр 1 будет строкой, массив указан в /var/www/dev01/maiarn/mail.php в строке 20 Предупреждение: move_uploaded_file() ожидает, что параметр 1 равен строка, массив, заданный в /var/www/dev01/maiarn/mail.php в строке 22 –

+0

$ target_path = $ target_path .basename ($ file ['name']); \t if (move_uploaded_file ($ file ['tmp_name'], $ target_path)) Это две строки, на которых возникают ошибки. –

+1

@HanyaIdrees Вы не можете просто передавать массивы так, как они есть; вам необходимо пройти через них и переместить каждый файл по отдельности. Я добавлю пример. Чтобы уточнить, несколько файлов не будут отображаться как разные записи в массиве '$ _FILES'; все они появятся под «загруженной» записью в '$ _FILES'. – Wiseguy

0

Попробуйте добавить уникальный номер каждого файла на каждой итерации цикла, как это:

$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" /> 
+0

Это dnt работает. Даже он изменяет файл на currupt, добавив 1, например daynay.jpg1. И только один файл передается по-прежнему –

Смежные вопросы