【问题标题】:Determinate mime type from MySQL column从 MySQL 列中确定 mime 类型
【发布时间】:2011-07-15 08:09:33
【问题描述】:

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

如果有人可以帮助我编写 PHP 代码或 MySQL 命令,那就太好了。

【问题讨论】:

  • 我不确定,但请尝试使用mime_content_type($mysql_row['blob_field')(我知道已弃用,但大多数主机尚未迁移到 PHP 5.3)。另外,不是说你可以改变这个(?),最好将图像存储在数据库之外。
  • 我知道,那个数据库是别人做的。所有列都可以再次输入/键入,但图像列。 PHP版本是5.2):

标签: php mysql blob mime-types


【解决方案1】:

如果您的主机仍然使用 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 归档 (.jar) 文件签名的前 4 个字节,需要额外声明在 foreach 循环中确定 mime 类型的正确签名,但对于您的情况,应该这样做。

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

【讨论】:

  • 大多数文件对我有用,pdf 文件不工作。由于某种原因,stripos 函数在签名中的任何地方都找不到幻数,尽管我可以在那里看到它。有什么想法吗?
  • @Patrick Evans 我丢失了数据库,我正在查看我的备份磁盘以找到它并检查了您的回答。我不想让这个问题没有答案。
【解决方案2】:

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

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

从数据库中获取您的二进制数据,并将其传递给此函数,可能会成功。


注意:它自带 PHP >= 5.3

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 是否有 PHP 5.2.11 / MySQL 5.0.92 的解决方案或指南?
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2016-05-23
    • 2012-01-25
    相关资源
    最近更新 更多