2010-07-22 2 views
9

У меня есть несколько изображений в мусорное ведро, я хочу, чтобы проверить заголовок, чтобы проверить формат (JPG, PNG и т.д.)PHP: двоичные данные изображения, проверяя тип изображения

Я не хочу использовать временные файлы ! У меня есть решение с использованием TEMP FILES.

ответ

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

+3

@DonutReply - только для людей, которые его ищут: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

У вас есть информация о последних битах, чтобы узнать конец изображения? – Daniel

1

Загружаются ли файлы или они уже находятся в файловой системе?

Попробуйте использовать mime_content_type(), чтобы получить MIME-формат файла.

0

Почему бы просто не проверить наличие файла? :)

Альтернативных

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

Абсолютно ненадежны. – Maerlyn

+0

Значит, большинство ваших GIF-файлов не являются GIF-файлами? Существует никаких причин, почему это не сработает, если вы не имеете дело с загрузкой пользователей, и даже тогда вам, вероятно, не о чем беспокоиться. – Dutchie432

+0

В 2012 году некоторые пользователи считают, что они могут конвертировать изображения, просто переименовав файл ... Таким образом, он не является надежным. – djleop

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

Его с помощью "Файл" команду * Никс надежно определить мим -тип данного файла:

$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

+0

Это действительно должно быть выше над моим текущим состоянием PHP, 5.3 стареет. – Wrikken

+0

Каков формат строки, который он вернет? –

Смежные вопросы