2010-07-22 113 views

回答

20

該位開始:

$JPEG = "\xFF\xD8\xFF" 
$GIF = "GIF" 
$PNG = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" 
$BMP = "BM" 
$PSD = "8BPS" 
$SWF = "FWS" 

其他的人,現在我不知道,但大3(JPEG,GIF,PNG),通常覆蓋99%。因此,將第一個字節與這些字符串進行比較,然後獲得答案。

+1

你可以舉一個例子,你將如何檢查這些使用PHP的一些二進制數據?感謝 – DonutReply 2011-05-10 16:44:54

+3

@DonutReply - 只爲人們尋找它:https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer 2015-03-27 14:00:06

+1

你想過最後位找出圖像結束的任何信息? – Daniel 2017-10-06 14:58:45

1

正在上傳的文件,或者是他們已經在文件系統上?

嘗試使用mime_content_type()來獲取文件的MIME格式。

0

爲什麼不檢查文件entension? :)

另類

if(exif_imagetype($filepath) == IMAGETYPE_JPEG){ 
    echo 'This is a JPEG image'; 
} 
+7

絕對不可靠的。 – Maerlyn 2010-07-22 20:06:52

+0

因此,大部分GIF文件實際上並不是GIF文件?除非你處理用戶上傳,否則沒有理由不起作用,即使這樣你也沒有什麼可擔心的。 – Dutchie432 2010-07-22 20:13:59

+0

2012年,一些用戶認爲只需重命名文件即可轉換圖像...因此,這不可靠。 – djleop 2012-10-09 13:14:00

6

這裏是由Wrikken

function getImgType($filename) { 
    $handle = @fopen($filename, 'r'); 
    if (!$handle) 
     throw new Exception('File Open Error'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS'); 
    $bytes = fgets($handle, 8); 
    $found = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $found = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $found; 
} 
0

使用FileInfo的PHP擴展所描述的功能的實現:

http://de.php.net/manual/en/function.finfo-file.php

其使用 「文件」 * nix的命令可靠地確定MIME給定文件的類型:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimetype = finfo_file($finfo, $filename); 
finfo_close($finfo); 

此擴展與PHP 5.3一起提供,或者可以從pecl(pecl install fileinfo)爲早期版本安裝。

25

我本身是你最不明白的問題:)(問題是如何驗證二進制數據的緩衝區,在磁盤上不是一個文件)。

我有同樣的問題,與解決它:

$finfo = new finfo(FILEINFO_MIME_TYPE); 
$finfo->buffer($rawImage); 
+1

這個解決方案是最好的,如果你正在使用PHP> 5.3 – djleop 2012-10-09 13:12:35

+0

這確實應該以上的PHP的當前狀態礦山被upvoted,5.3是老了。 – Wrikken 2014-08-19 16:39:18

+0

它將返回什麼字符串格式? – 2017-01-18 10:18:09