我正在使用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(,我认为此选项会更准确。