2012-02-17 10 views
1

phpmailerを使用して複数の添付ファイルを含むメールを送信しています。複数の添付ファイルを送信するために使用したループは、添付ファイル付きのメッセージで、最後に選択したファイルのみを含み、最初の2つまたは1つのファイルは送信されません。 Loopに問題がありますか?してください:3番目のファイルは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

この実行後にアップロード/ディレクトリをチェックすると、いくつのファイルがありますか? 1つしかない場合は、それぞれの連続したループで最初のファイルを上書きしている可能性があります。 3人ともそこにいるのなら...まあ...もう1つの問題 – itsmequinn

+0

ファイルは1つだけです。どのように私はこの書き換えの問題を解決することができます.. –

答えて

1

がそうのように、入力フィールドの名前に[]を追加します。

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

各ファイルは同じ名前の「アップロード済み」を使用しているため、「アップロード済み」は処理される連続するファイルに置き換えられます。角括弧を追加することによって、連続する各ファイルが代わりに "アップロードされた"配列に追加されます。

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つのファイルには、各配列のインデックス1は、その次のファイルである、とされています。ここで私は[]を追加した後に取得$_FILES配列です。


同じ名前の複数のチェックボックスの値を取得する方法も同じです。どのようにあなたがアップロードしたファイルをループはできる(例えばthis commentを参照してください。


ここにあります。私は、現在のファイルのインデックスを追跡するためにforループで$iを使用する方法

// 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 />"; 
    } 
} 

お知らせ

(なぜ私がarray_filter()に電話をかけたのか不思議であれば、ファイルをアップロードしないと空白のエントリが自動的に存在するように見えます)array_filter()はその空白/ ry。)

+0

警告:basename()は、パラメータ1が文字列であることを期待しています、array /var/www/dev01/maiarn/mail.php 20行目 警告:move_uploaded_file()は、文字列でなければなりません。配列は/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))これらはエラーが発生する2行です。 –

+1

@ HanyaIdrees配列をそのまま渡すことはできません。ループして各ファイルを個別に移動する必要があります。私は例を追加します。明確にするために、 '$ _FILES'配列に複数のファイルが異なるエントリとして表示されることはありません。それらはすべて$ _FILESの "uploaded"エントリの下に表示されます。 – 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仕事を教えてください。たとえdaynay.jpg1のように1を加えることで、Fileをcurruptに変更します。そして、1つのファイルだけが前と同じように転送されます –

関連する問題