2015-07-06 90 views
8

我有一個包含3個獨立文件輸入字段的表單。我似乎無法找到一種方法在將它們上傳到服務器之前單獨驗證它們的MIME類型。 (前兩個應該只允許MP3文件,而最後一個只允許使用JPEG文件。)在將文件上傳到服務器之前驗證多個文件上傳中的單個文件

我該怎麼做,或者最好在文件上傳後檢查MIME類型,那麼要麼保留它,要麼刪除它並返回錯誤信息?

這裏是我的代碼:

<form action="upload.php" method="post" enctype="multipart/form-data"> 

    <div class="col-2"> 
    <label> 
     Full MP3 file 
     <input type="file" name="file_array[]" id="file_array[]" tabindex="1" required> 
    </label> 
    </div> 

    <div class="col-2"> 
    <label> 
     Sample MP3 file (30-45 seconds) 
     <input type="file" name="file_array[]" id="file_array[]" tabindex="2" required> 
    </label> 
    </div> 

    <div class="col-2"> 
    <label> 
     JPEG Cover Art (Recommended 400 x 400 px) 
     <input type="file" name="file_array[]" id="file_array[]" tabindex="3" required> 
    </label> 
    </div> 

    <div class="col-2"> 
    <label> 
     <progress id="progressBar" value="0" max="100" style="width:100%;"> </progress> 
    </label> 
    </div> 

    <div class="col-submit"> 
    <input type="submit" value="Upload" class="submitbtn" onclick="uploadFile()"> 
    </div> 

</form> 

,這是upload.php的

if(isset($_FILES['file_array'])){ 
    $name_array = $_FILES['file_array']['name']; 
    $tmp_name_array = $_FILES['file_array']['tmp_name']; 
    $type_array = $_FILES['file_array']['type']; 
    $size_array = $_FILES['file_array']['size']; 
    $error_array = $_FILES['file_array']['error']; 
    for($i = 0; $i < count($tmp_name_array); $i++){ 
     if(move_uploaded_file($tmp_name_array[$i], "../artists/$id/temp/".$name_array[$i])){ 
      echo $name_array[$i]." upload is complete<br>"; 
     } else { 
      echo "move_uploaded_file function failed for ".$name_array[$i]."<br>"; 
     } 
    } 
} 
+5

JavaScript驗證也是最好的建議。你最好用[''](http://stackoverflow.com/questions/181214/file-input-accept-attribute-is-it-useful )過濾器。如果文件內容是瀏覽器聲稱/猜測的,你仍然必須在PHP中斷言。 – mario

回答

0

我認爲你可以使用驗證在客戶端,使體驗更加順暢。馬里奧指出,你可以使用這樣的事情只接受mp3文件:

<input type="file" accept=".mp3" name="file_array[]" id="file_array[]" tabindex="1" required> 

但因爲你不能信任的用戶數據,還必須添加服務器端驗證。例如:

if(isset($_FILES['file_array'])){ 
$name_array = $_FILES['file_array']['name']; 
$tmp_name_array = $_FILES['file_array']['tmp_name']; 
$type_array = $_FILES['file_array']['type']; 
$size_array = $_FILES['file_array']['size']; 
$error_array = $_FILES['file_array']['error']; 
for($i = 0; $i < 3; $i++){ 

    if ($i == 2){ 
     if($type_array[2] != 'image/jpeg'){ 
      echo 'Invalid file type: ' . $type_array[2]; 
      break; 
     } 
    } 
    else { 
     if($type_array[$i] != 'audio/mp3'){ 
      echo 'Invalid file type: ' . $type_array[$i]; 
      break; 
     } 
    } 

    if(move_uploaded_file($tmp_name_array[$i],"../artists/$id/temp/".$name_array[$i])){ 
     echo $name_array[$i]." upload is complete<br>"; 
    } else { 
     echo "move_uploaded_file function failed for ".$name_array[$i]."<br>"; 
    } 
} 
} 

測試了上面的代碼,它似乎在爲我工作。

注:

如果你已經知道上傳的文件數量不使用count,因爲它可能導致的風險,如果你想上傳的文件數量在同一時間是可變的,然後確保count結果不會超過最大值。在循環之外也使用count,所以它只計算一次。

還有其他更嚴格的方法來驗證文件類型,但這是我現在得到的。

希望這有助於並給予反饋,如果我委屈如何。

0

你不能,因爲數據只有在上傳後纔可用。您可以嘗試通過以下方式告訴瀏覽器(如果有能力)僅發送特定的MIME類型:

<input type="file1" name="image" accept="image/*"> 
<input type="file2" name="pdf" accept="application/pdf">