我收到了一个来自MSAccess(不是我最喜欢的)的导出数据库,然后我将其导入到了MySQL表中。有一列名为“customerImage”,它是一个“long BLOB”类型,属性为“binary”。如何确定Mime类型?我尝试了不同的方法,但所有方法都需要是文件而不是数据。
如果有人能帮我提供PHP代码或MySQL命令,那就太好了。
我收到了一个来自MSAccess(不是我最喜欢的)的导出数据库,然后我将其导入到了MySQL表中。有一列名为“customerImage”,它是一个“long BLOB”类型,属性为“binary”。如何确定Mime类型?我尝试了不同的方法,但所有方法都需要是文件而不是数据。
如果有人能帮我提供PHP代码或MySQL命令,那就太好了。
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类型的正确签名,但对于您的情况,这应该足够了。finfo_buffer()
函数,可能会有所帮助,这里引用一下:从数据库中获取二进制数据,然后将其传递给该函数,可能会解决问题。注意:它适用于PHP >= 5.3。此函数用于获取字符串中二进制数据的信息。
可以使用FileInfo扩展。它包含一个名为finfo_buffer()
的函数。
mime_content_type($mysql_row['blob_field'])
(已弃用,我知道,但大多数主机尚未升级到 PHP 5.3)。此外(您可以更改吗?),最好将图像存储到数据库之外。 - Bojangles