2017-09-15 61 views
0

我有一個HTML表單像這樣:處理輸入=「文件」陣列

<form method="post" enctype="multipart/form-data"> 
    <input type="file" name="pictures[]" required> 
    <input type="file" name="pictures[]"> 
    <input type="file" name="pictures[]"> 
    <input type="file" name="pictures[]"> 
    <input type="file" name="pictures[]"> 
</form> 

,使得用戶可以上傳最多5張圖片。我知道我可以用<input type="file" name="pictures[]" multiple>這樣做,但是我的想法是,我希望用戶能夠從他們的設備的不同文件夾中選擇文件,因此我以上述格式編寫的原因。

現在,我現在面臨的挑戰是,並非所有的輸入都是必需的,並且當提交表單時,我會執行正常輸入檢查$_FILES['pictures']['name],它循環遍歷所有文件數組,這是正常的他們有相同的名字。

現在我的頭痛..

  • 我如何驗證只,同時保持所需的視野中的一個輸入一個文件中的投入?

現在,如果我在輸入框中添加少於5個文件時進行了檢查$_FILES['pictures']['name'],由於未輸入輸入字段,它將返回一個錯誤。

編輯

首先,我可以檢查是否進入至少一個文件,然後我檢查是否有任何的文件不返回任何錯誤。看到我的代碼如下:

if (count($_FILES['pictures']['name']) < 1) { 
    echo "Please enter at least one image"; 
} 
elseif ($_FILES['pictures']['error'] != 0) { 
    echo "Sorry, one or more of your uploaded images is invalid"; 
} 

現在,如果不是所有5個輸入字段都輸入,表單將始終返回一個錯誤。

ANOTHER編輯

也許我無法清楚地解釋我想實現..但這裏的要點。

除此之外,一個輸入是必需的,當表單沒有所有的領域提交的進入,我做類似這樣(跳過所需的檢查)的事實

$files = array(); 
$fileData = $_FILES['pictures']; 
$files = array(); 
if (is_array($fileData['name'])) { 

    for ($i=0; $i < count($fileData['name']) ; ++$i) { 
     $files[] = array(
      'name' => $fileData['name'][$i], 
      'tmp_name' => $fileData['tmp_name'][$i], 
      'type' => $fileData['type'][$i], 
      'error' => $fileData['error'][$i], 
      'size' => $fileData['size'][$i], 
     );   
    } 
} 
else { 
    $files[] = $fileData; 
} 

所以當我執行驗證時,如:

foreach ($files as $file) { 
    if ($file['name'] == '') { 
     echo "Error"; 
    } 
} 

,並且用戶沒有輸入所有圖像,它會返回錯誤消息。

$files回報的print_r()這樣的:

Array 
(
    [photos] => Array 
     (
      [name] => Array 
       (
        [0] => 11356010_127900540886840_1152019271_n.jpg 
        [1] => 11370980_130679033939470_1067474802_n.jpg 
        [2] => 
        [3] => 
        [4] => 
       ) 

      [type] => Array 
       (
        [0] => image/jpeg 
        [1] => image/jpeg 
        [2] => 
        [3] => 
        [4] => 
       ) 

      [tmp_name] => Array 
       (
        [0] => C:\xampp7\tmp\php1C9F.tmp 
        [1] => C:\xampp7\tmp\php1CaF.tmp 
        [2] => 
        [3] => 
        [4] => 
       ) 

      [error] => Array 
       (
        [0] => 0 
        [1] => 0 
        [2] => 4 
        [3] => 4 
        [4] => 4 
       ) 

      [size] => Array 
       (
        [0] => 108492 
        [1] => 108492 
        [2] => 0 
        [3] => 0 
        [4] => 0 
       ) 

     ) 

    [files] => Array 
     (
      [name] => 
      [type] => 
      [tmp_name] => 
      [error] => 4 
      [size] => 0 
     ) 

) 

有沒有辦法做我檢查時,我可以使空字段被忽略?

我知道我可以通過檢查空字段並在提交時添加disabled的屬性來做到這一點,但如果用戶在他/她的瀏覽器中關閉了javascript,會發生什麼?

我使用array_filter()像這樣嘗試:

$filtered = array_filter($_FILES['pictures'], function($var){ 
    return !empty($var['pictures']['name']); 
}); 

,但它返回一個空數組。有人能請我指出正確的方向嗎?

+0

如果事情便被輸入然後'name'關鍵不是空的。如果輸入和上傳成功,那麼'error'鍵是0. –

+0

是的,但是如果上傳的文件少於5個,並且我檢查文件名爲空的'name',它會返回一個錯誤,因爲其他輸入沒有輸入。 –

+1

我看不到檢查的代碼,我幫不了你。 –

回答

1

$_FILES['pictures']['error']最終會成爲一組錯誤代碼,因此您可以循環並明確處理它們。有一個good example of this in the PHP documentation

對於您的情況,您可能需要處理循環的第一次迭代作爲特例,因爲您已將第一次循環定義爲必需的。事情是這樣的:

foreach ($_FILES["pictures"]["error"] as $key => $error) { 
    if ($key == 0 && $error != UPLOAD_ERR_OK) { 
     // the required one didn't succeed, so we have a problem 
    } else { 
     // ... 
+0

如何根據實際輸入的數量檢查其他輸入? –

+0

這將是這個解決方案的'else'部分。當你繼續循環時,你會看到是否有其他錯誤。如果沒有,請繼續。你嘗試過'var_dump($ _ FILES [「pictures」]);'看看整個數組是什麼樣的?這可能有助於理解它。 – mopo922

+0

是的,我已經完成了這個工作,它返回了'empty'作爲'name'和'tmp_name','size'返回'0',並且因爲在emtpy數組中沒有看到任何文件。 –