2016-12-03 6 views
1

私は両方のファイルを "upload.php"に送信するフォームが必要です。 "Upload.php"は、アップロードされたファイルをターゲットディレクトリに移動し、サムネイルを生成します。ファイルをアップロードする - >配列/単一のファイル

  • 問題/質問:$ _FILESアレイを得ることはありませんupload.phpこの 場合のように、一つの形態では、唯一ファイルを送信します。 (入力タイプ= "ファイル"名= "ファイル">)。このフォームはモバイルデバイスから送信され、ファイルオブジェクトを配列に変更する方法がわからないので、これを変更することはできません
  • もう1つのフォームは、1つ以上のファイル(入力タイプ=名前=>「[]ファイル」「ファイル」私はforeachの付いたファイルの配列を歩く私のupload.phpで

:。

foreach($_FILES['file']['tmp_name'] as $key => $tmp_name){ 
    $new_image_name = $key.$_FILES['file']['name'][$key]; 
    $file_tmp =$_FILES['file']['tmp_name'][$key]; 
    $dest=$_SERVER['DOCUMENT_ROOT']."uploads/".$new_image_name; 
    move_uploaded_file($file_tmp, $dest); 
    // and so on... 
} 

それが動作ファイル配列を送る形で しかし、1つのファイルだけを送信するフォームがforeachを通過しないと想像することができます。

それで、両方のフォームでupload.phpを動作させる最良の解決策は何ですか? 私の考え方:upload.phpはまず、$ Filesが配列で、配列に変換していない場合にチェックしなければなりません。 foreachは常に配列を取得します

+1

あなたは両方のフォームで同じファイル名を使用するだけです、 '名= "ファイル[]"。角括弧は、PHPが配列構造を生成するようにするものです。 – CBroe

答えて

1

ファイルがアップロードされると、$ _FILE変数は常に1つまたは複数のファイルをアップロードする配列です。

ので

Array 
    (
     [file] => Array 
      (
       [name] => Array 
        (
         [file1] => MyFile.txt 
         [file2] => MyFile.jpg 
        ), 

       [type] => Array 
        (
         [file1] => text/plain 
         [file2] => image/jpeg 
        ), 

       [tmp_name] => Array 
        (
         [file1] => /tmp/php/php1h4j1o 
         [file2] => /tmp/php/php6hst32 
        ), 

       [error] => Array 
        (
         [file1] => UPLOAD_ERR_OK 
         [file2] => UPLOAD_ERR_OK 
        ), 

       [size] => Array 
        (
         [file1] => 123 
         [file2] => 98174 
        ) 
     ) 
) 

はそう、複数のファイルのアップロードのために、私は[「tmp_name」]をアクセスしたい場合は言うことができます。..複数のファイルのための$ _file変数の典型的なマッピングが似ている、複数のファイルについて言うことができます$temp_name = $_FILES['file']['tmp_name']のように複数のファイルをアップロードした場合、$temp_nameには配列が含まれます

1つのファイルのアップロードでは、違いは$temp_name = $_FILES['file']['tmp_name']です。 $temp_nameには、アップロードされた単一ファイルの1文字列の文字列が含まれます。

私たちは実際に配列にキャストし、複数のアップロードのように見せます。$temp_name = (array)$_FILES['file']['tmp_name']を書き込むと、今度は$temp_nameファイルに配列が含まれます。これは基本的には単一の文字列ですが、インデックスは0です。

ここで、単一ファイルアップロードと複数ファイルアップロードの両方がよく似ていますか?

だから、それに基づいて、あなただけの1ファイル、foreachのforeach((array) $_FILES['file']['tmp_name'] as $key => $tmp_name)中(配列)鋳造があるかどうだから今、これは、あなたの例の両方で動作します。..

// lets be sure that $_FILES are not empty 
if(!empty($_FILES)) { // I might did this check already, if so, ignore it 

    // now we are going to type cast the $_FILE variable as an array 

     foreach((array) $_FILES['file']['tmp_name'] as $key => $tmp_name){ 

     $file_names = (array) $_FILES['file']['name']; // just ensuring that single file name is in array format 

     $new_image_name = $key.$file_names[$key]; // no worries about the $key! 
     $file_tmp = $tmp_name[$key]; 

     $dest=$_SERVER['DOCUMENT_ROOT']."uploads/".$new_image_name; 
     move_uploaded_file($file_tmp, $dest); 
     // and so on... 
     } 

    } 

のようにコードを変更することができます$_FILES['file']['tmp_name']には少なくとも1つのtmp_nameを持つ配列が含まれ、複数のアップロードの場合は既に配列になっています!

私は$file_names = (array) $_FILES['file']['name'];と同じことをして、少なくとも1つのファイルをアップロードする場合には少なくとも1つの名前を含む名前の配列が常に存在するようにしました。

同じ方法で他の値にアクセスできます。

希望します。

0

いいですね。ちょうどあなたのhtmlを1つのファイルのアップロードのために次のようになります。

<form action="" method="post" enctype="multipart/form-data" > 
    <input type="file" name="file[]"> 
    <button name="submit" type="submit" class="btn btn-default save_change_btn">upload photo</button> 
</form> 

そして、これを2つのファイルのためのアップロード:

<form action="" method="post" enctype="multipart/form-data" > 
    <input type="file" name="file[]"> 
    <input type="file" name="file[]"> 
    <button name="submit" type="submit" class="btn btn-default save_change_btn">upload photo</button> 
</form> 
関連する問題