Определить тип mime из столбца MySQL

Я получил экспортированную базу данных из MSAccess (не мой любимый) и импортировал ее в таблицу MySQL. Там есть столбец с именем «customerImage» и тип «длинный BLOB» с «двоичным» атрибутом. Как я могу определить тип Mime? Я пробовал разные методы, но для всех них требуется файл, а не данные.

Если бы кто-то мог помочь мне с кодом PHP или командой MySQL, было бы здорово.


person quantme    schedule 14.03.2011    source источник
comment
Я не уверен, но попробуйте сделать mime_content_type($mysql_row['blob_field') (я знаю, что это устарело, но большинство хостов еще не перешли на PHP 5.3). Кроме того, вы не можете изменить это (?), гораздо лучше хранить изображения вне базы данных.   -  person Bojangles    schedule 15.03.2011
comment
Я знаю, что эта база данных была сделана другим человеком. Все столбцы можно ввести/напечатать снова, но столбец изображения. Версия PHP 5.2):   -  person quantme    schedule 15.03.2011


Ответы (4)


ЕСЛИ ваш хост все еще использует php 5.2 и не имеет доступа к функциям fileinfo, вы можете проверить подпись заголовка файла (магические числа), чтобы определить тип mime.

function mimetype($data)
{
    //File signatures with their associated mime type
    $Types = array(
    "474946383761"=>"image/gif",                        //GIF87a type gif
    "474946383961"=>"image/gif",                        //GIF89a type gif
    "89504E470D0A1A0A"=>"image/png",
    "FFD8FFE0"=>"image/jpeg",                           //JFIF jpeg
    "FFD8FFE1"=>"image/jpeg",                           //EXIF jpeg
    "FFD8FFE8"=>"image/jpeg",                           //SPIFF jpeg
    "25504446"=>"application/pdf",
    "377ABCAF271C"=>"application/zip",                  //7-Zip zip file
    "504B0304"=>"application/zip",                      //PK Zip file ( could also match other file types like docx, jar, etc )
    );

    $Signature = substr($data,0,60); //get first 60 bytes shouldnt need more then that to determine signature
    $Signature = array_shift(unpack("H*",$Signature)); //String representation of the hex values

    foreach($Types as $MagicNumber => $Mime)
    {
        if( stripos($Signature,$MagicNumber) === 0 )
            return $Mime;  
    }

    //Return octet-stream (binary content type) if no signature is found
    return "application/octet-stream"; 
}

ПРИМЕЧАНИЕ. Некоторые подписи могут частично совпадать с другими, например, подпись файла PK Zip соответствует первым 4 байтам подписи файла java-архива (.jar), потребуются дополнительные операторы в foreach цикла, чтобы определить правильную подпись для типа mime, но для вашей ситуации это должно подойти.

Обновленный список сигнатур файлов можно найти по адресу http://www.garykessler.net/library/file_sigs.html, если кому-то нужно больше типов подписи файлов.

person Patrick Evans    schedule 23.03.2011
comment
Большинство файлов у меня работали, pdf не работают. По какой-то причине функция stripos нигде в подписи не находит Magic Number, хотя я его там вижу. Любые идеи? - person ForeignerBR; 20.04.2012
comment
@ Патрик Эванс Я потерял базу данных, я просматриваю свои резервные диски, чтобы найти ее, и проверил, что вы ответили. Я не хочу оставлять этот вопрос без ответа. - person quantme; 22.11.2012

Расширение FileInfo и, в частности, , его функция finfo_buffer() может помощь, здесь (цитирую) :

Эта функция используется для получения информации о двоичных данных в строке.

Извлечение ваших двоичных данных из базы данных и передача их этой функции могут помочь.


Примечание. Он поставляется с PHP >= 5.3.

person Pascal MARTIN    schedule 14.03.2011
comment
Печально, но факт: запросил у принимающей компании (hostgator) обновление с PHP 5.2 до 5.3, говорят дата обновления не определена. - person quantme; 15.03.2011
comment
о :-( так типично :-( ; другое решение - fr.php.net/manual/en/function.mime-content-type.php ; но работает только с файлами :-( - person Pascal MARTIN; 15.03.2011

Сохраните большой двоичный объект во временный файл и используйте функцию php finfo_file. в теме.

person nfechner    schedule 14.03.2011

Можно использовать расширение FileInfo. Он содержит функцию с именем finfo_buffer().

person Marijn van Vliet    schedule 14.03.2011
comment
Есть ли решение или руководство для PHP 5.2.11/MySQL 5.0.92? - person quantme; 15.03.2011