PHP if 语句认为 png 扩展名是 jpg/jpeg(检查 pathinfo())


PHP if statement thinks png extension is jpg/jpeg (checking against pathinfo())?

我正在使用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(,但不适用于较大的图像...谁能解释一下?

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

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

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

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

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

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

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

这基本上与...

$extension == TRUE

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

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

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

或者,您可以做...

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

。或。。。

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

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

您可以尝试使用 或 mime_content_type 或 Fileinfo 获取文件的 mime 类型(png(,我认为此选项会更准确。