2016-12-03 32 views
1

我得到的形式都發送文件到「upload.php」。 「Upload.php」將上傳的文件移動到目標目錄並生成縮略圖。上傳文件 - >陣列/單個文件

  • 問題/問題:一種形式只發送一個文件,所以在這種情況下, upload.php的沒有得到一個$ _FILES數組。 (輸入類型=「文件」名稱=「文件」>)。此表單是從移動設備發送的,我不知道如何將文件對象更改爲數組,因此我無法更改此
  • 另一個表單發送帶有一個或多個文件的文件數組(輸入類型= 「文件」名稱=「文件[]」>

以我upload.php的我通過文件陣列一個foreach行走:

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... 
} 

隨着它發送一個文件陣列它工作的形式完美 但是,正如你可以想象的那樣,只發送一個文件的表單不能通過這個foreach。

那麼最好的解決方案,以獲得upload.php這兩種形式的工作? 我的想法:upload.php首先必須檢查,如果$ Files是一個數組,並且如果沒有將其轉換爲數組。那麼foreach會得到一個陣列

+1

所有你需要做的兩種形式是使用相同的文件名,'名= 「文件[]」'。方括號是什麼讓PHP生成數組結構。 – CBroe

回答

1

那麼,如果文件上傳,$ _FILE變量總是一個數組,您可以上傳單個或多個文件。

因此,可以說有關的多個文件,典型映射爲多個文件$ _FILE變量是如..

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的值」]從多個文件上傳,如$temp_name = $_FILES['file']['tmp_name']然後$temp_name將包含一個數組,

區別在於,對於單個文件上傳,$temp_name = $_FILES['file']['tmp_name']; $temp_name將包含一個字符串,一個上傳的單個文件的字符串。現在

,我們實際上可以將它轉換爲數組,並使它看起來像多個上傳,再次爲單個文件,如果我寫$temp_name = (array)$_FILES['file']['tmp_name']現在$temp_name文件將包含一個數組,這基本上是一個字符串,但包裹在一個陣列索引爲0.

現在單個和多個文件上傳看起來都差不多嗎?

因此,基於這一點,你可以因此,現在修改代碼如..

// 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... 
     } 

    } 

,這會爲您的兩個情況下工作,如果只有1個文件,在foreach foreach((array) $_FILES['file']['tmp_name'] as $key => $tmp_name)(陣列)鑄造將確保$_FILES['file']['tmp_name']將包含一個至少有1個tmp_name的數組,並且對於多次上傳,它已經是一個數組!

我也在$file_names = (array) $_FILES['file']['name'];做過同樣的事情,以確保總是會有一個名稱數組,它至少包含1個用於單獨上傳文件的名稱。

您可以用相同的方式訪問其他值。

希望它有道理:)

0

它看起來不錯。只要你的HTML必須是這樣的一個文件上傳:

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