2015-03-13 55 views
5

Próbuję dołączyć wiele obrazów w załącznikach. Użyłem Forearchu dla każdego załącznika, ale nie uzyskuję nazwy i imienia, gdy używam foreach, prawdopodobnie robię coś złego. Poniżej znajduje się kod i błędy:Dodawanie wielu załączników w PHPMailer

HTML wejściowe

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

var_dump od $ _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 dla nazwy i 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 

KOD:

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); 
} 
+0

Pamiętaj, że żaden z przedstawionych odpowiedzi obsługiwać przesłane bezpiecznie, zgodnie [docs PHP] (http://php.net/manual/en/features.file-upload.php). Oprzyj swój kod na [przykładach przesyłania plików dostarczonych z PHPMailer] (https://github.com/PHPMailer/PHPMailer/blob/master/examples/), które obsługują pliki poprawnie. – Synchro

Odpowiedz

3

Witamy w złej stronie PHP. $_FILES nie jest tym, czego mógłby oczekiwać programista.

//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]; 

Więc trzeba coś takiego

$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); 
} 
0
$i = '0'; 
foreach($_FILES['upload-file'] as $file) { 
$name = $file['name'][$i]; 
$path = $file['tmp_name'][$i]; 
var_dump($name); 
var_dump($path); 
$mail->addattachment($path,$name); 
$i++; 
} 
2

Dzięki za wszystkie odpowiedzi. Jestem pewien, że wszystkie twoje podejścia będą działały dobrze, ale postanowiłem rozwiązać to sam. Kod ten rozwiązał problem

$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]); 
} 

mam nadzieję ktoś, kto ma ten sam problem dostaje pomoc od tutaj ...

0

Większość tutejszych rozwiązania oparte są na postaciach.

Więc wymyśliłem proste rozwiązanie, jeśli chcesz dołączyć wszystkie pliki z określonego katalogu.

$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); 
    } 
}