2010-08-22 79 views
2

如何檢測上傳的文件是否是使用PHP的圖像?我不希望使用imagesize()或檢查文件擴展名。檢測上傳的文件是否是PHP中的圖像

+0

「一幅圖像」究竟意味着什麼?哪些格式? – 2010-08-22 14:26:32

+0

任何格式,jpeg,png,bmp – X10nD 2010-08-22 14:27:22

+2

你是什麼意思的「任何格式」?怎麼樣TIFF,PCX,PSD?那麼RGB/CMYK圖像是一種CMYK JPEG(不能在Internet Explorer中工作)的有效圖像?你需要在瀏覽器中顯示圖像嗎?那麼像動畫GIF這樣的動畫格式呢? – 2010-08-22 14:28:34

回答

8

別傻了,使用工具,爲此特別製作 - 和getimagesize()

+0

我以爲只會檢查圖像大小?不是它是否是一個圖像? – 2010-08-22 14:46:09

+0

@ jiewmeng你的邏輯在哪裏?我們不能沒有圖像的尺寸,我們可以嗎? – 2010-08-22 14:51:07

+0

@jiwemeng手冊:'...將確定任何給定圖像文件的大小,並返回尺寸以及文件類型和高度/寬度文本字符串...' – 2010-08-22 14:57:03

1

您可以使用mime_content_type並驗證上傳文件的類型。由於mime_content_type已棄用,因此可以使用其備用finfo_open

+4

「這個函數已被棄用」 – svens 2010-08-22 14:33:04

+0

使用'fileinfo()'代替它,它代替了mime_content_type – 2010-08-22 16:57:15

5

您可以使用ImageMagick identify tool來獲得更廣泛的圖像格式比和getimagesize()的信息支持,例如

$uploaded=$_FILES["myfile"]["tmp_name"]; 
$info = `identify $uploaded`; 

下面是一個JPEG

img029.jpg JPEG 1240x1753 1240x1753+0+0 8-bit PseudoClass 256c 27.3KiB 0.000u 0:00.000 
+1

好的解決方案 - 當然,安裝了ImageMagick並且可以調用外部二進制文件。 – 2010-08-22 14:56:03

+0

雖然有點矯枉過正? – 2010-08-22 15:24:03

+0

@Kieran如果他想檢測比getimagesize()支持的更多圖像格式,則不需要。 – 2010-08-22 15:50:27

4

如果你談論的是那些將要顯示在瀏覽器的圖像輸出示例,和你想爲確保儘可能它們是有效的圖像,我建議使用適當的imagecreatefrom*()功能在GD中打開它們並將它們保存回所需的目標格式。

這不僅確保它們是圖像 - 如果輸入數據被破壞,這將不起作用 - 但它也會濾除任何可能的惡意攻擊,利用瀏覽器圖形庫中的泄漏,並移除圖像中包含的元數據(其中經常包含作者,用於創建圖像的程序,相機,位置和拍攝時間等敏感信息,並確保可以在瀏覽器中查看圖像(CMYK JPG上傳,不會顯示任何版本的IE ,不起作用。)

這樣做的一個潛在缺點是JPEG圖像可能會受到質量輕微損失(GD的JPG編碼質量不好),並且透明膠片圖像可能會出現問題。

+0

+1進行重新編碼。這也可以通過IMagick擴展來完成,這種擴展佔用的資源較少。 – 2010-08-22 14:50:57

相關問題