如何检测上传的文件是否不是图片?

时间:2017-01-05 13:00:50

标签: php file-upload upload

如何检查文件上传文件是完全图像而不是视频文件和其他内容?

我测试了一个简单的代码,用于检查上传的文件是否为图像。

形式

<form method="post" enctype="multipart/form-data">
    <input type="file" name="photo" accept="image/*">
    <input type="submit" name="submit" value="Test">
</form>

虽然我有accept="image/*",但我可以轻松将其更改为All types并获取非图片文件。

用于检查文件是否为有效图片的代码(仅用于测试)

if($_POST['submit']) {
    $tmp_file = $_FILES['photo']['tmp_name'];
    if(mime_content_type($tmp_file)) {
        var_dump(mime_content_type($tmp_file));
    } else {
        echo 'error1';
    }
    if(getimagesize($tmp_file)) {
        var_dump(getimagesize($tmp_file));
    } else {
        echo 'error2';
    }
}

到目前为止,我对此进行了3次测试,2次传递1次失败:

  1. 测试图像=已通过。
  2. 测试非图片有效 .srt file =已通过(向getimagesize提供错误)
  3. 测试有效的视频文件 .mp4 =失败(提交后,加载时间为5-10秒,不会出现任何错误)
  4. 我需要做些什么?我不知道是什么问题,因为它没有给出var_dump()echo 'errors'的任何结果。我现在想的是 PHP 正在接受该文件。

    注意

    我需要这样做,以便只上传有效的图片。

    注2

    标记问题上接受的答案与我无关。

    更新

    如果我尝试上传小于 128M 的视频,则会返回一些内容。但如果它大于 128M ,我的localhost中什么都没有,但我在生产网站上测试了它,它给了我一个REQUEST TIME OUT

2 个答案:

答案 0 :(得分:1)

查找此类文件扩展名并检查有效类型...

function  getextension($name){
    $count=substr_count($name,".");
    if($count>1){//some cases have two dotes
        $name= preg_replace('/\.(?=.*\.)/', '_', $name);
    }
    list($txt, $ext) = explode(".", $name);
    return $ext;
}

$name = $_FILES['imageupload']['name'];//Name of the File
$image_extension = getextension($name);

 $allowed_extension = array("jpg", "png", "gif", "bmp", "jpeg","JPG","PNG","GIF","BMP","JPEG");
 $image_extension=getextension($name);
  if (!in_array($image_extension, $allowed_extension)) {
    $error_flag = 1;
    $message = "Invalid File Format";
 }

答案 1 :(得分:1)

根据问题点解析和检查扩展名是不够的。

我建议在加载文件后检查文件 EXIF(可交换图像信息)数据。

您可以在扩展基础上进行基本验证,如果成功,请检查图像的exif数据。

为此你需要一个单独的DLL加载,它将具有exif相关的功能。

http://php.net/manual/en/ref.exif.php