PHP: двоичные данные изображения, проверка типа изображения - PullRequest
9 голосов
/ 22 июля 2010

У меня есть несколько изображений в bin, я хочу проверить заголовок, чтобы проверить формат (jpg, png и т. Д.)

Я не хочу использовать временные файлы!У меня есть решение с использованием ТЕМП. ФАЙЛОВ.

Ответы [ 7 ]

29 голосов
/ 28 июня 2012

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

У меня была та же проблема, и я решил еес:

$finfo = new finfo(FILEINFO_MIME_TYPE);
$finfo->buffer($rawImage);
21 голосов
/ 23 июля 2010

Биты начинаются с:

$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%. Итак, сравните первые байты с этой строкой, и у вас есть ответ.

6 голосов
/ 23 июля 2010

Вот реализация функции, описанная 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;
}
1 голос
/ 23 июля 2010

http://php.net/manual/en/function.getimagesize.php

"Индекс 2 является одной из констант IMAGETYPE_XXX, указывающих тип изображения."

1 голос
/ 22 июля 2010

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

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

0 голосов
/ 23 июля 2010

Используйте PHP-расширение fileinfo:

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

Используется команда * file "* nix для надежного определения mime-типа данного файла:

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

Это расширение поставляется с PHP 5.3 или может быть установлено из pecl (pecl install fileinfo) для более ранних версий.

0 голосов
/ 22 июля 2010

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

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

if(exif_imagetype($filepath) == IMAGETYPE_JPEG){
    echo 'This is a JPEG image';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...