2011-04-09 123 views
1

我有一個表格上傳多個文件:檢查是否至少有一個文件被上傳PHP

<?php 
    $num_uploads = 3; 
    $num = 0; 
    while($num < $num_uploads) 
    { 
     echo '<div><input name="userfile[]" type="file" /></div>'; 
     $num++; 
    } 
?> 

我如何檢查是否至少有一個文件是用PHP或JavaScript提交?

回答

0

鑑於您如何構建表單,您必須考慮PHP構建文件數組的方式。

foreach($_FILES['userfile']['error'] as $key => $err) { 
    if ($err === UPLOAD_ERR_OK) { 
     ... got at least one file ... 
    } 
} 

出於某種原因魯鈍,而不是內$_FILES它自己單獨的子陣列中存儲的每個文件的上傳數據,選擇採用PHP,而不是傳播每個單獨的錯誤/名/ tmp_name的值的/ etc ...在正常的類別像這樣:

$_FILES = array(
    'userfile' => array(
     'name' => array(
      0 => 'name of file #1' 
      1 => "name of file #2' 
      etc... 
     ), 
     'tmp_name' => array(
      0 => 'temp name of file #1' 
      1 => 'temp name of file #2' 
    etc.. etc... etc.. 
    ) 
); 

一個更加合理的和可以理解的版本會一直

$_FILES = array(
     'userfile' => array(
      0 => array(
       'name' => 'name of file #1' 
       'tmp_name' => 'temp name of file #1' 
       ... 
      ), 
      1 => array(
       'name' => 'name of file #2' 
       'tmp_name' => 'temp name of file #2' 
       ... 

但是,唉,PHP已經再次揹負世界用過於複雜和愚蠢笨拙。

+0

這不是PHP,而是你。這是你命名你的輸入。所以,只怪你自己 – 2011-04-10 03:27:44

+0

我不會這樣命名我的輸入。但是,這並沒有改變這個事實,即這是一種無法獲得文件細節的方式。 – 2011-04-10 13:54:50

0
<?php 
if (count($_FILES)) { 
    // at least 1 file 
} 
?> 
+0

你應該真的在檢查'if(count($ _ FILES)> 0)'而不是。雖然你的答案是正確的(任何數字不是0都轉換爲真),但是在瀏覽代碼時以及爲新程序員理解時,這種隱式轉換可能會造成混淆。 – Brad 2011-04-09 20:33:14

+0

@布拉德:果然如此。正確的形式也包含返回false,null等的函數,這些函數都通過通用檢查一起提交。我想我倒在「如果(1 + 3> 2)...」的「如果沒有其他含義,那麼更短更清晰」的一面...... – Sajid 2011-04-09 21:09:43

0

試試這個,

$i = 0; 
foreach ($_FILES as $file){ 
    if($file['size'] > 0){ 
     $i++; 
    }   
} 

現在如果$i > 0至少一個文件被上傳。 $i是上傳的文件總數。

+0

如果用戶想要上傳零字節文件?請檢查'$ file ['error'] === UPLOAD_ERR_OK',如果上傳正常工作,則無論文件大小如何,都將保證爲真。 – 2011-04-10 02:33:29

相關問題