2010-07-22 41 views

Trả lời

20

Các bit bắt đầu với:

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

Những người khác tôi sẽ không biết ngay bây giờ, nhưng lớn 3 (jpeg, gif, png) thường bao gồm 99%. Vì vậy, so sánh các byte đầu tiên với chuỗi đó và bạn có câu trả lời của mình.

+1

Bạn có thể đưa ra một ví dụ về cách bạn sẽ kiểm tra những điều này đối với một số dữ liệu nhị phân bằng cách sử dụng php? cảm ơn – DonutReply

+3

@ DonutReply - chỉ dành cho những người đang tìm kiếm: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

Bạn có bất kỳ thông tin nào về các bit cuối cùng để tìm ra phần cuối của hình ảnh không? – Daniel

1

Các tệp đang được tải lên hoặc chúng đã có trên hệ thống tệp chưa?

Hãy thử sử dụng mime_content_type() để nhận định dạng MIME của tệp.

0

Tại sao không chỉ kiểm tra tệp entension? :)

Một lựa chọn

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

Hoàn toàn không đáng tin cậy. – Maerlyn

+0

Vì vậy, hầu hết các tệp GIF của bạn không thực sự là GIF? Có thực sự KHÔNG có lý do này sẽ không hoạt động trừ khi bạn đang đối phó với tải lên của người dùng, và thậm chí sau đó bạn có thể không có gì phải lo lắng về. – Dutchie432

+0

Vào năm 2012, một số người dùng tin rằng họ có thể chuyển đổi hình ảnh chỉ bằng cách đổi tên tệp ... Vì vậy, nó không đáng tin cậy. – djleop

6

Dưới đây là một thực hiện các chức năng như mô tả của 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

Sử dụng tiện ích fileInfo PHP:

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

của nó bằng cách sử dụng "file" * nix lệnh đáng tin cậy xác định mime -loại của một tệp nhất định:

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

Phần mở rộng này được vận chuyển với PHP 5.3 hoặc có thể được cài đặt từ pecl (pecl install fileinfo) cho các phiên bản trước đó.

25

Tôi có thể hiểu rằng hầu hết các bạn không hiểu câu hỏi :) (câu hỏi là cách xác thực dữ liệu nhị phân trong bộ đệm, không phải tệp trên đĩa).

tôi đã cùng một vấn đề, và giải quyết nó với:

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

Giải pháp này là tốt nhất, nếu bạn đang sử dụng PHP> 5.3 – djleop

+0

Điều này thực sự nên được upvoted trên tôi với trạng thái hiện tại của PHP, 5.3 là nhận được cũ. – Wrikken

+0

Định dạng chuỗi nó sẽ trả về là gì? –

Các vấn đề liên quan