从MySQL列中确定MIME类型

3

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

如果有人能帮我提供PHP代码或MySQL命令,那就太好了。


我不确定,但请尝试执行 mime_content_type($mysql_row['blob_field']) (已弃用,我知道,但大多数主机尚未升级到 PHP 5.3)。此外(您可以更改吗?),最好将图像存储到数据库之外。 - Bojangles
我知道,数据库是由其他人制作的。所有列都可以重新输入/键入,但图像列不行。PHP版本为5.2 ): - quantme
4个回答

4
如果您的主机仍在使用php 5.2并且没有访问文件信息函数,您可以测试文件头签名(魔术数字)以确定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归档(.jar)文件签名的前4个字节匹配,在foreach循环中需要额外的语句来确定MIME类型的正确签名,但对于您的情况,这应该足够了。
如果有人需要更多的文件签名类型,请查看http://www.garykessler.net/library/file_sigs.html上的更新文件签名列表。

大多数文件对我来说都可以工作,但pdf文件无法工作。由于某种原因,stripos函数在签名中找不到Magic Number,尽管我可以看到它。有什么想法吗? - ForeignerBR
@Patrick Evans 我丢失了数据库,我正在查找备份磁盘以找到它并检查您的回答。我不想让这个问题处于未回答状态。 - quantme

3
FileInfo扩展,特别是其finfo_buffer()函数,可能会有所帮助,这里引用一下:

此函数用于获取字符串中二进制数据的信息。

从数据库中获取二进制数据,然后将其传递给该函数,可能会解决问题。注意:它适用于PHP >= 5.3

可悲但真实的是:我向主机公司(hostgator)请求将PHP 5.2更新至5.3,他们表示更新日期尚未确定。 - quantme
1
哦 :-( 如此典型 :-(;另一个解决方案是http://fr.php.net/manual/en/function.mime-content-type.php;但它只适用于文件 :-( - Pascal MARTIN

1

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


0

有没有关于PHP 5.2.11 / MySQL 5.0.92 的解决方案或指南? - quantme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接