我有一个MySQL表,其中一些数据blob数据存储在一个单元格中。
我试图回应它。
但我不知道该数据的mime类型。如何根据给定的blob数据确定mime类型?
我尝试了这段代码,但不知道mb类型的blob:
<?php
mysql_connect("localhost","root","");
mysql_select_db("contents");
$sql="SELECT * FROM `contents` limit 1";
$result=mysql_query($sql);
$row=mysql_fetch_assoc($result);
echo $row['html']
?>
答案 0 :(得分:4)
你必须在db中添加插入“blob”的mime,如果你强行,你可以这样选择:
if (!function_exists('mime_content_type ')) {
function mime_content_type($filename) {
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mimetype;
}
}
$filename = tempnam('/tmp', 'cre');
$fp = fopen($filename, 'w');
fwrite($fp, $row['html']);
fclose($fp);
$ctype = mime_content_type($filename) ;
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".'samename'."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
unlink($filename);
echo $row['html'];
这种方式并不好,因为有很多用法,但是有可能。 我提供更新表并添加mime-type并按顶部代码编辑所有记录...
你有第二种方式并使用:
header("Content-type: application/force-download");
这是强制下载标题,可以将文件保存在用户的PC中。
答案 1 :(得分:2)
您应该在插入数据库中将MIME类型存储为数据库中的单独列。
缺乏这一点,你可以尝试猜测,模块MIME_Type可能会有帮助。
答案 2 :(得分:0)
这样做会产生巨大的开销。您应该像其他用户建议的那样将MIME类型存储在插入中。
不要使用从表单上传中收到的MIME类型,因为这不能被信任(它很容易被客户端伪造),但是在上传文件后自己计算。
如果你已经有一个BLOB中没有MIME类型的表,但是你知道你会经常引用这些文件,我建议你添加MIME列并编写一个脚本来填充所有的MIME字段循环遍历现有记录并添加此值。
因此,请参阅类型的MIME字段,而不是将所有BLOB加载到内存中以解析MIME类型。
答案 3 :(得分:0)
这是一个老问题,但它是搜索结果中的第一个
要获取二进制字符串的mime类型,您可以使用finfo_buffer(或finfo类)http://php.net/manual/fr/function.finfo-buffer.php
// Object oriented style
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->buffer($buffer);
// Procedural style
$finfo = finfo_open(FILEINFO_MIME);
$mime = finfo_buffer($finfo, $buffer)