2013-02-25 78 views
1

我正在使用PHP将图像处理为缩略图,并且允许使用3种不同的扩展名:.jpg,.jpeg,& .png ...前两个和后一个必须通过不同的函数处理,分别是createimagefromjpg()和createimagefrompng()。PHP if语句认为png扩展名是jpg/jpeg(检查pathinfo())?

我获取图像的文件扩展名,然后使用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中替换=====进行严格比较,jpeg文件错误地完全显示出'jpg'!='jpg'(即使它的确如此),并且与jpeg同样如此。 PNG文件完全破坏了脚本。


编辑:这个问题似乎不是我的IF语句,但imagecreatefrompng()功能。它适用于小图像(200x200),但不适用于较大的图像...任何人都可以解释这一点吗?

回答

5

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

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

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

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

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

+0

有趣......似乎部分工作。JPG和JPEG文件现在可以像往常一样识别,但PNG文件仍然完全破坏脚本... – ReactingToAngularVues 2013-02-25 02:23:32

+0

是否实际上被称为PNG扩展名的elseif?确保它不是一个不同的错误 – 2013-02-25 02:24:21

+0

我怎么能告诉? – ReactingToAngularVues 2013-02-25 02:30:12

2

这不是你如何写你的条件。您现在有...

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

这基本上是一样的...

$extension == TRUE 

...这是真的,那么只要该字符串不是空的。

相反,使比较单独像...

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

或者,你可以做...

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

......或者......

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

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

+0

请注意大小写。 “JPG”的扩展名不会被这个比较所捕获。使用'strcasecmp($ extension,'jpg')'进行不区分大小写的比较。 – 2013-02-25 02:24:36

+0

是正确的,或只是'strtolower($ extension)'进行比较之前。 – alex 2013-02-25 02:27:19

1

你可以尝试使用或mime_content_typeFileinfo获取文件的MIME类型(PNG,我觉得这个选项会更准确。

+0

我已经验证了以前的MIME类型......因此,无论如何,任何能够达到此阶段的图像都是jpeg/jpg/png。 – ReactingToAngularVues 2013-02-25 02:25:14