【问题标题】:PHP if statement thinks png extension is jpg/jpeg (checking against pathinfo())?PHP if 语句认为 png 扩展名是 jpg/jpeg(检查 pathinfo())?
【发布时间】:2013-02-10 03:11:19
【问题描述】:

我正在使用 PHP 将图像处理成缩略图,并且我允许通过 3 种单独的扩展类型:.jpg、.jpeg 和 .png... 前 2 和后者必须通过不同的方式处理分别是 createimagefromjpg() 和 createimagefrompng() 函数。

我正在获取图像的文件扩展名,然后使用 if 语句检查它是哪种文件类型,以便正确处理:

$extension = pathinfo($filename, PATHINFO_EXTENSION);

// Read source image
if ($extension == ('jpg' || 'jpeg')) {
    $source_image = imagecreatefromjpeg($filename); 
    return '1';
} else if ($extension == 'png') {
    $source_image = imagecreatefrompng($filename);
    return '2';
} else {
    return 'error';
}

jpg 和 jpeg 图像被正确处理,因为这个函数返回 1...所以一切看起来都很好。但是,当我通过 png 文件时,它同样会进入第一个分支并返回“1”,即使 png != jpeg 或 jpg。诡异的。此错误导致我的缩略图根本不生成。

它变得更加混乱。如果我通过在 IF statemtn 中将 == 替换为 === 来启用严格比较,则 jpg 和 jpeg 文件会完全出错,这表明显然 'jpg' != 'jpg' (即使它确实如此),同样使用 jpeg。 PNG 文件完全破坏了脚本。


编辑:问题似乎不是我的 IF 语句,而是 imagecreatefrompng() 函数。它适用于小图像(200x200),但不适用于较大的图像......谁能解释一下?

【问题讨论】:

    标签: php png mime file-type


    【解决方案1】:

    您的 if 语句使用了不正确的语法。使用这个:

    if ($extension == 'jpg' || $extension == 'jpeg') {
    

    您的示例将 ('jpg' || 'jpeg') 评估为布尔值。由于字符串在 PHP 中的计算结果为 true,因此该语句始终是正确的。

    $extension 然后将类型转换为布尔值,使您的语句等效于(true == true)

    使用 === 运算符将导致 $extension 不被类型转换,因此它将是 ("some string value" === true) 这是错误的。

    【讨论】:

    • 有趣......这似乎部分工作。 jpg 和 jpeg 文件现在可以像往常一样被识别,但 png 文件仍然会完全破坏脚本......
    • 是否真的为 PNG 扩展调用 elseif?确保不是其他错误。
    • 我只需将die('This works'); 行放在PNG 的else if 语句中。如果您看到该文本,则它有效,否则无效。请务必将其放在 return 语句之前。
    • 嗯...事情变得更奇怪了..我在$source_image = imagecreatefrompng($filename); 之后添加了die('This works'); 并且它仍然崩溃了...尽管注释掉了后者,但是却产生了 die 声明。所以看来$source_image = imagecreatefrompng($filename);有问题
    【解决方案2】:

    您可以尝试使用或mime_content_typeFileinfo获取文件的mime-type(png,我认为这个选项会更准确。

    【讨论】:

    • 我之前已经验证了 MIME 类型...所以任何进入此阶段的图像都是 jpeg/jpg/png。
    【解决方案3】:

    这不是你写你的条件的方式。您目前有...

    $extension == ('jpg' || 'jpeg')
    

    这与...基本相同

    $extension == TRUE
    

    ...这是真的,只要字符串不为空。

    相反,分别进行比较...

    $extension == 'jpg' || $extension == 'jpeg'
    

    或者,你可以这样做......

    preg_match("/^jpe?g\z/", $extension);
    

    ...或...

    in_array($extension, array("jpg", "jpeg"))
    

    等等,但它们(可以说)更难阅读。

    【讨论】:

    • 小心大小写。这种比较不会发现“JPG”的扩展名。使用strcasecmp($extension, 'jpg') 进行不区分大小写的比较。
    • True,或者只是strtolower($extension),然后再进行比较。
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2015-08-21
    相关资源
    最近更新 更多