在将文件上载到服务器之前,验证多个文件上载中的单个文件

use*_*799 8 javascript php arrays validation file-upload

我有一个包含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>
Run Code Online (Sandbox Code Playgroud)

这是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>";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 1

我认为您可以在客户端使用验证来使体验更加流畅。正如 Mario 指出的,您可以使用类似的方法来仅接受 mp3 文件:

<input type="file" accept=".mp3" name="file_array[]" id="file_array[]" tabindex="1" required>
Run Code Online (Sandbox Code Playgroud)

但由于您不能信任用户数据,因此还必须添加服务器端验证。例如:

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>";
    }
}
}
Run Code Online (Sandbox Code Playgroud)

测试了上面的代码,它似乎对我有用。

笔记:

如果您已经知道上传文件的数量,请不要使用count,因为这可能会导致风险,并且如果您希望一次上传的文件数量是可变的,那么请确保结果count不超过最大值。也使用count循环外部,因此只计算一次。

还有其他更严格的方法来验证文件类型,但这就是我现在得到的。

希望这会有所帮助,如果我有任何错误,请提供反馈。