PHP上传文件类型、大小和存在性?

PHP上传文件类型、大小和存在性?,php,upload,Php,Upload,我目前正在使用这个PHP代码来实现上传功能。我需要知道如何为1)扩展名、2)文件大小限制和3)添加一些文件类型验证,以检查是否确实选择了要上载的文件 谢谢你的帮助 <?php if(isset($_POST['submit'])){ if(count($_FILES['upload']['name']) > 0){ //Loop through each file for($i=0; $i<count($_FILES['upload'][

我目前正在使用这个PHP代码来实现上传功能。我需要知道如何为1)扩展名、2)文件大小限制和3)添加一些文件类型验证,以检查是否确实选择了要上载的文件

谢谢你的帮助

<?php
if(isset($_POST['submit'])){
    if(count($_FILES['upload']['name']) > 0){
        //Loop through each file
        for($i=0; $i<count($_FILES['upload']['name']); $i++) {
          //Get the temp file path
            $tmpFilePath = $_FILES['upload']['tmp_name'][$i];

            //Make sure we have a filepath
            if($tmpFilePath != "tmp/"){

                //save the filename
                $shortname = $_FILES['upload']['name'][$i];

                //save the url and the file
                $filePath = "uploads/" . date('d-m-Y-H-i-s').'-'.$_FILES['upload']['name'][$i];

                //Upload the file into the temp dir
                if(move_uploaded_file($tmpFilePath, $filePath)) {

                    $files[] = $shortname;
                    //insert into db 
                    //use $shortname for the filename
                    //use $filePath for the relative url to the file

                }
              }
        }
    }

          header('Location: http://localhost/FloodMap/report.html');
          exit;
}
?>

检查文件扩展名

$tmpFilePath = $_FILES['upload']['tmp_name'][$i];

    $imageFileType = pathinfo($tmpFilePath,PATHINFO_EXTENSION);

    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
    && $imageFileType != "gif" ) {
        echo "Only JPG, JPEG, PNG & GIF files are allowed.";
    }
检查文件大小

if ($_FILES["upload"]["size"][$i] > 500000) {
    echo "Sorry, your file is too large.";
}
检查是否收到文件

if($_FILES['upload']['tmp_name'][$i]!=""){


}
  • 正在检查文件是否已成功上载
PHP在
$\u文件
数组中返回错误代码。比如说

if ($_FILES['upload']['error'] == UPLOAD_ERR_OK) {
    /* the file was uploaded successfully */
}
  • 正在检查文件扩展名
虽然
$\u文件
数组确实提供了扩展名,但重要的是要记住,这是客户机提供的数据,因此不可信。事实上,在这个数组中,您唯一可以信任的就是错误和tmp_名称,PHP提供了这个名称。其他一切都来自客户

因此,为了验证某个文件是否符合您的预期,您必须检查文件的magic MIME字节是否符合以下内容

  • 检查文件大小
同样,如前所述,虽然
$\u FILES
数组为上载提供了一个大小键,但它是客户端提供的数据,不应被信任。只需检查
文件大小($\u FILES['upload']['tmp\u name'])
。这样就可以检查文件的实际大小


奖金 FWIW,在服务器级别检查文件大小(如果唯一的目的是告诉用户该文件太大)会带来相当糟糕的用户体验。最好先在客户端做这样的事情,这样他们就可以在上传文件之前知道,如果文件太大的话

在HTML5中,我们可以使用。在表单中,只需附加到一些事件侦听器,如
onchange
或其他内容,然后检查
文件.files[0].size
以提醒用户。您也可以对文件类型执行相同的操作


当然,如果出于其他目的需要检查服务器端的文件大小限制,我并不是建议您不要检查。就其本身而言,如果这是告诉用户他们上传的文件太大的唯一方法,它会破坏用户体验。

您可以检查此项以获得扩展名,您只需将$_文件['upload']['size']放入此链接,您将得到所有答案:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['upload']['tmp_name']);

$allowedMimes = ['image/jpg','image/gif','image/png'];

if (!in_array($mimeType, $allowedMimes, true)) {
    throw new FileException("File not allowed...");
}