PHP bir fotoğrafın dosya uzantısı türü almak için en iyi yolu

4 Cevap

Benim sitede benim fotoğraf yükleme bölümü-bina yeniden ediyorum, o yüzden iyi performans ile güvenli ama aynı zamanda bunu yapabilirsiniz kadar ben olabildiğince öğrenmeye çalışıyorum. MY sitesi genellikle dakikada tarih 15-20 fotoğrafları aound etti

Yani bu yöntem jpg, gif, png gibi, fotoğrafın dosya türünü gettting için güvenilir?

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

4 Cevap

Dosya uzantıları, en azından yapabilirsiniz yalan, ya da. Bu / güven kullanıcı verilerini teslim güvenmemek kesinlikle en iyisidir. Ayrıca, PHP kılavuzu notları gibi:

$_FILES['userfile']['type'] - The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

Bu güvenilir değildir.

Burada daha iyi bir yolu var:

PHP'nin getimagesize() function returns a numerically indexed array of data about the image, and index 2 is one of the IMAGETYPE_XXX constants (a full list of which is available here) görüntü türünü göstermektedir. Bunlar daha sonra GD etti fonksiyonları bir dizi kullanılabilir, iki ilgili olanlar image_type_to_extension() and image_type_to_mime_type() olmak.

Yani, kolayca bu satırlar boyunca bir şey yapabilirsiniz:

$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]);

Eğer exif uzantısı mevcut olan IIF, [exif_imagetype()][5] function getimagesize() indeksi 2 olarak aynı sonucu dönmek ama çok daha hızlı olacak, rağmen.

Daha yaygın mevcut PHP genelinde yükler çünkü ben, benim birincil örnek olarak GD yöntemleri kullandım. Ama Imagick uzatma da benzer bir işlevsellik sunuyor ve ayrıca (btw 5.3, beri dahil) fileinfo uzantısı ile mime türünü doğrulamak olabilir.

exif_imagetype () Belirli bir dosya geçerli bir resim dosyası olup olmadığını kontrol etmek için en hızlı, en güvenli ve en güvenilir yolu, aynı zamanda uzaktan URL'ler ile çalışır.

The return value is the same value that getimagesize() returns in index 2 but exif_imagetype() is much faster.

$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
}

the doc diyor

Eğer the browser provided this information dosyanın mime tipi. [...] Bu MIME türü PHP tarafında denetlenmez ve bu nedenle don't take its value for granted.

İstediğim çok fazla bir şey yüklemek ve sizin için bir jpeg gibi görünmesi, çünkü diğer kelime, bunu güven olmamalıdır.

Emin bir yüklenen dosya aslında bir resim yapmak için, ben personnaly mükemmel sonuçlar geçmişte Imagick::identifyImage kullandım. GD muhtemelen mevcut fonksiyonunun aynı tür var.

Yoksa fileinfo uzantısını kullanarak mime tipi sunucu tarafı alabilir, daha spesifik finfo_file()

İlk olarak, getimagesize veya exif_imagetype() deneyin

o ['mime'], finfo_file deneyin (eğer extension_loaded('fileinfo')), dönmezse

hala hiçbir sonuç ise, mime_content_type if (function_exists('mime_content_type')) deneyin.

Eğer don't want mime type, fakat just file extension, kullanın pathinfo($path, PATHINFO_EXTENSION).