1

我正在使用 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 中的 with 来启用严格比较=====则 jpg 和 jpeg 文件会完全出错,表明显然是 'jpg' != 'jpg' (即使它确实如此),同样使用 jpeg。PNG 文件完全破坏了脚本。


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

4

3 回答 3

5

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

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

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

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

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

于 2013-02-25T02:17:58.610 回答
2

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

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

基本上是一样的...

$extension == TRUE

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

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

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

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

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

...或者...

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

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

于 2013-02-25T02:19:05.883 回答
1

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

于 2013-02-25T02:20:41.750 回答