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

时间:2016-06-23 08:14:10

标签: 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']['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;
}
?>

2 个答案:

答案 0 :(得分:1)

检查文件扩展名

$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]!=""){


}

答案 1 :(得分:1)

  • 检查文件是否已成功上传

According to the manual PHP在validates_presence_of :primary_product, scope: :student_id数组中返回错误代码。例如......

$_FILES
  • 检查文件扩展名

虽然if ($_FILES['upload']['error'] == UPLOAD_ERR_OK) { /* the file was uploaded successfully */ } 数组确实提供了扩展程序,但请务必记住这是客户端提供的数据,因此无法信任。事实上,你可以信任的那个数组中唯一的东西就是PHP提供的错误和tmp_name。其他一切都来自客户。

因此,为了验证文件是否符合您的预期,您必须检查文件魔术MIME字节与finfo_file

之类的内容
$_FILES
  • 检查文件大小

同样,如前所述,虽然$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..."); } 数组提供了上传的大小键,但这是客户端提供的数据,不应该被信任。相反,只需与$_FILES核对即可。这样你就可以检查文件的实际大小了。

加成

FWIW,检查服务器级别的文件大小(如果唯一的目的是告诉用户此文件太大)会导致相当糟糕的用户体验。最好先在客户端级别做这样的事情,这样他们就会知道,如果文件太大,他们甚至还要上传文件。

在HTML5中,我们可以使用File API执行此操作。在您的表单中,只需附加一些事件监听器,如filesize($_FILES['upload']['tmp_name'])或其他内容,然后检查onchange以提醒用户。您也可以对文件类型执行相同的操作。

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