【问题标题】:php how to use getimagesize() to check image type on upload [duplicate]php如何使用getimagesize()检查上传时的图像类型[重复]
【发布时间】:2012-09-27 12:09:37
【问题描述】:

可能重复:
GetImageSize() not returning FALSE when it should

我目前有一个过滤系统如下:

   // Check to see if the type of file uploaded is a valid image type
function is_valid_type($file)
{
    // This is an array that holds all the valid image MIME types
    $valid_types = array("image/jpg", "image/JPG", "image/jpeg", "image/bmp", "image/gif", "image/png");

    if (in_array($file['type'], $valid_types))
        return 1;
    return 0;
}

但有人告诉我最好自己检查文件类型,我将如何使用 getimagesize() 以类似的方式检查文件类型?

【问题讨论】:

  • Caution: 不要使用 getimagesize() 来检查给定文件是否为有效图像。

标签: php image upload filter mime-types


【解决方案1】:

getimagesize() 返回一个包含 7 个元素的数组。数组的索引 2 包含指示图像类型的 IMAGETYPE_XXX 常量之一。

使用 getimagesize() 提供的函数的等价物是

function is_valid_type($file)
{
    $size = getimagesize($file);
    if(!$size) {
        return 0;
    }

    $valid_types = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP);

    if(in_array($size[2],  $valid_types)) {
        return 1;
    } else {
        return 0;
    }
}

【讨论】:

  • 感谢您的回复,但此代码在 Dreamweaver 中的 if(!$size){ 行中返回错误
  • 第三行少了一个分号,现在应该可以了。
  • 您应该将文件名作为参数传递给 is_valid_type($file) 函数。你可能给它一个 $_FILES 数组。尝试类似 is_valid_type($file['name'])。或者您可以将“getimagesize($file)”更改为“getimagesize($file['name'])”,这样您就可以像原来的函数一样调用它。但是由于该函数只需要文件名,所以让它期望一个数组是没有意义的。
  • 这个错误在这种情况下非常有意义:PHP 找不到有问题的文件,很可能是因为它不存在。您可以尝试打印出您传递给is_valid_type($file) 的文件名$file,看看它是否存在。我的猜测是上传的图像要么保存到另一个文件夹,要么在上传过程中重命名。这取决于您对事物的实现,而不是与 is_valid_type 函数相关的事物。也就是说,我的看法是,当您调用 is_valid_type 时,图像尚未移动到它的最终位置:尝试$file['tmp_name']
  • 所以,总而言之,上述函数的用法是:is_valid_type($_FILES['file']['tmp_name']),如果您直接从 $_FILES 数组中检查。我有点希望我不必阅读字里行间就得出这个结论。
【解决方案2】:

首先检查getimagesize是否返回false。如果是,则该文件不是可识别的图像格式(或根本不是图像)。

否则,获取返回数组的索引 2 并通过image_type_to_mime_type 运行它。这将返回一个字符串,如“image/gif”等。有关更多信息,请参阅docs

【讨论】:

    【解决方案3】:

    你可以如下使用

    $img_info   = getimagesize($_FILES['image']['tmp_name']);
    $mime   = $img_info['mime']; // mime-type as string for ex. "image/jpeg" etc.
    

    【讨论】:

    • 你测试过这段代码吗????你不能使用getimagesize on $_FILES['images']['tmp_name'] 它会返回false
    • 这很有趣...codepad.viper-7.com/N96kma它返回Warning: getimagesize(): Filename cannot be empty...这可能是特定于PHP版本的问题
    • 该代码容易受到 PHP Exif 注入的影响。
    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2023-04-04
    • 2016-07-19
    • 2016-09-14
    • 2016-01-31
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多