2009-08-15 38 views
3

我在我的網站上重新構建了我的照片上傳部分,我儘可能多地學習,因此我可以安全地做到這一點,但也具有最佳性能。我的網站有15-20張照片每分鐘上傳一般以PHP格式獲取照片文件擴展名的最佳方式

那麼這種方法是可靠的獲取照片的文件類型,如jpg,gif,png?

$fileType = $_FILES['image']['type']; 
+1

**'image_type_to_extension(exif_imagetype( 'your_file_name'));'您的文件** 將輸出**( '巴紐 ' '.JPEG' 等),即使它不是' 擴展'。以文件的名義 - 'exif_imagetype()'從文件開頭的文件簽名中讀取類型。 – fider 2013-06-28 13:10:20

回答

13

文件擴展名說謊,或者至少可以。絕對最好不要依賴/信任用戶提交的數據。此外,作爲PHP手冊說明:

$ _FILES [ 'userfile的'] [ '型'] - 文件的MIME類型,如果瀏覽器提供此信息。一個例子就是「image/gif」。然而,這種MIME類型在PHP方面沒有被檢查,因此不會將其值視爲理所當然。

這不可靠。

這裏的一個更好的方式:

PHP的getimagesize()函數返回關於所述圖像數據的一個數字索引陣列,並且索引2是表示圖像的種類的IMAGETYPE_XXX常數(a full list of which is available here)中的一個。這些可用於多種GD系列功能,兩種相關的功能是image_type_to_extension()image_type_to_mime_type()

所以,你可以很容易地做一些事情沿着這些路線:

$imageData = getimagesize($_FILES['userfile']['tmp_name']); 
// $imageData[2] will contain the value of one of the constants 
$mimeType = image_type_to_mime_type($imageData[2]); 
$extension = image_type_to_extension($imageData[2]); 

雖然IIF您掌握exif延長,[exif_imagetype()][5]函數將返回完全相同的結果爲getimagesize()指數2,但速度要快得多。

我使用GD方法作爲我的主要示例,因爲它們更常見於PHP安裝中。但是,Imagick擴展也提供了類似的功能,並且您還可以使用fileinfo擴展名(自5.3包含,btw)來驗證MIME類型。

+0

+1,哈哈,你打我吧。 getimagesize是我會用的。 – karim79 2009-08-15 04:41:24

1

由於the doc說,

的MIME類型的文件,如果瀏覽器提供此信息。 [...]然而,這種MIME類型在PHP方面沒有被檢查,因此不認爲它的價值爲

換句話說,你不應該相信它,因爲我可以上傳我想要的任何東西,並使它看起來像一個JPEG。

爲了確保上傳的文件實際上是一個圖像,我個人在過去使用Imagick::identifyImage以優異的結果。 GD可能具有相同的可用功能。

或者你可以使用FileInfo的擴展得到MIME類型的服務器端,更具體finfo_file()

+0

+1,因爲儘可能使用Imagick函數而不是GD函數,因爲它們更高效。 – karim79 2009-08-15 05:06:29

2

exif_imagetype()是最安全,最快和最可靠的方法來檢查給定的文件是否是有效的圖像文件,它也適用於遠程URL。

返回值是和getimagesize相同的值()返回在索引2 但exif_imagetype()被快得多。

$type = @exif_imagetype($_FILES['image']['tmp_name']); 

if (($type >= 1) && ($type <= 3)) 
{ 
    echo 'Valid image (GIF, JPG or PNG).'; 
} 

else 
{ 
    unlink($_FILES['image']['tmp_name']); // delete it 
} 
2

首先嚐試getimagesizeexif_imagetype()

,如果它不返回['mime'],嘗試finfo_file(如果extension_loaded('fileinfo')),

如果仍然沒有結果,儘量mime_content_type(如果function_exists('mime_content_type')) 。

如果不想MIME類型,但只是文件擴展名,使用pathinfo($path, PATHINFO_EXTENSION)

+0

使用pathinfo($ path,PATHINFO_EXTENSION)。用戶不能用一個jpg擴展名來命名一個php文件,系統會認爲它是一個jpg文件? – JasonDavis 2009-08-15 14:45:36

+0

@jasondavis,是的。這就是爲什麼這不是一個好的解決方案。 – jason 2009-08-15 16:24:08

相關問題