1

我有一个 MySQL 表,其中一些数据 blob 数据存储在一个单元格中。

我试图回应它。

但我不知道该数据的 MIME 类型。如何从给定的 blob 数据中确定 mime 类型?

我尝试了这段代码,但不知道 blob 的 mime 类型:

<?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']

?>
4

4 回答 4

4

您必须在数据库中添加带有插入“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 类型并按顶级代码编辑所有记录...

你有第二种方法和使用:

  header("Content-type: application/force-download");

这是强制下载标头,可以将文件保存在用户的 PC 中。

于 2012-12-11T12:05:24.363 回答
2

您应该在插入时将 MIME 类型作为单独的列存储在数据库中。

缺少这个,你可以尝试猜测它,模块MIME_Type可能会有所帮助。

于 2012-12-11T11:31:56.843 回答
2

这是一个老问题,但它是搜索结果中的第一个问题

要获取二进制字符串的 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)
于 2016-12-02T15:55:50.403 回答
0

这样做会产生巨大的开销。您应该按照其他用户的建议在插入时存储 MIME 类型。

不要使用从表单上传接收到的 MIME 类型,因为这是不可信的(它很容易被客户端伪造),而是在文件上传后自己计算。

如果您已经有一个充满 BLOB 文件且没有 MIME 类型的表,但您知道您需要定期引用这些文件,我建议您添加 MIME 列并编写一个脚本,通过循环使用所有值填充 MIME 字段通过现有记录并添加它。

因此,请参考 MIME 字段的类型,而不是将所有 BLOB 加载到内存中来解析 MIME 类型。

于 2012-12-11T11:55:59.423 回答