从MySQL列确定mime类型

时间:2011-03-14 21:03:49

标签: php mysql blob mime-types

我从MSAccess(不是我最喜欢的)收到了导出的数据库,然后将其导入MySQL表。有一个名为'customerImage'的列,是一个'long BLOB'类型,'binary'作为属性。如何确定Mime类型?我尝试过不同的方法,但所有这些方法都需要成为一个文件而不是数据。

如果有人可以帮助我使用PHP代码或MySQL命令会很棒。

4 个答案:

答案 0 :(得分: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文件签名与java archive(.jar)文件签名的前4个字节匹配,需要额外的语句在foreach循环中确定mime类型的正确签名,但对于你的情况,这应该做。

如果有人需要更多文件签名类型,可以在http://www.garykessler.net/library/file_sigs.html找到更新的文件签名列表。

答案 1 :(得分:3)

FileInfo扩展程序,更具体地说,它的finfo_buffer()功能可能会有所帮助,这里(引用)

  

此功能用于获取   有关二进制数据的信息   字符串。

从数据库中获取二进制数据并将其传递给此函数可能会起到作用。


注意:它附带PHP> = 5.3

答案 2 :(得分:1)

将blob保存到临时文件并在其上使用php finfo_file函数。

答案 3 :(得分:0)

可以使用FileInfo扩展名。它包含一个名为finfo_buffer()

的函数