quantme
quantme

Reputation: 3657

Determinate mime type from MySQL column

I received an exported database from MSAccess (not my favorite) and I imported it to a MySQL table. There's a column named 'customerImage' and is a 'long BLOB' type with 'binary' as attribute. How can I determinate the Mime Type? I've tried different methods but all of them requires to be a file but data.

If someone could help me with PHP code or MySQL command would be great.

Upvotes: 3

Views: 8108

Answers (4)

Patrick Evans
Patrick Evans

Reputation: 42736

IF your host still uses php 5.2 and dont have access to the fileinfo functions you can test the files header signature (magic numbers) to determine mime type

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"; 
}

NOTE: Some signatures may match partials of others, for instance the PK Zip file signature matches the first 4 bytes of java archive (.jar) file signature, extra statements would be needed in the foreach loop to determine the correct signature for the mime type, but for your situation this should do.

A updated list of file signatures can be found at http://www.garykessler.net/library/file_sigs.html if someone needs more file signature types.

Upvotes: 4

Marijn van Vliet
Marijn van Vliet

Reputation: 5399

The FileInfo extension can be used. It contains a function called finfo_buffer()

Upvotes: 0

nfechner
nfechner

Reputation: 17525

Save the blob to a temp file and use the php finfo_file function on it.

Upvotes: 1

Pascal MARTIN
Pascal MARTIN

Reputation: 400952

The FileInfo extension, and, more specifically, its finfo_buffer() function, might help, here (quoting) :

This function is used to get information about binary data in a string.

Fetching your binary data from database, and passing it to this function, might do the trick.


Note : its comes with PHP >= 5.3

Upvotes: 3

Related Questions