2013-02-25 81 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