MongoDB GridFS映像未正确加载


MongoDB GridFS image not loaded correctly

我正在尝试使用GridFS将图像保存到MondoDB集合。为了测试这一点,我做了以下操作:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<?php
// open connection
$m = new MongoClient();
$db = $m->selectDB('ImageDatabase');
$gridUploads = $db->getGridFS('images');
// save image
$fileName = 'C:'Users'Thomas'Pictures'commits.png';
$gridUploads->storeFile($fileName);
// load image
$doc = $gridUploads->findOne($fileName);
// dsplay image
header('Content-type: image/png');
echo $doc->getBytes();
?>

</body>
</html>

这应该将图像上传到集合,然后从集合中获得相同的图像并显示它

之后的采集内容是:

{
    "_id" : ObjectId("52a6fcdd1dc38f0c3c0016bf"),
    "filename" : "C:''Users''Thomas''Pictures''commits.png",
    "uploadDate" : ISODate("2013-12-10T11:37:01.000Z"),
    "length" : 179952,
    "chunkSize" : 262144,
    "md5" : "768d618923442668ca2a60f02be59d52"
}

print_r($doc):

MongoGridFSFile Object
(
    [file] =&gt; Array
        (
            [_id] =&gt; MongoId Object
                (
                    [$id] =&gt; 52a6fcdd1dc38f0c3c0016bf
                )
            [filename] =&gt; C:'Users'Thomas'Pictures'commits.png
            [uploadDate] =&gt; MongoDate Object
                (
                    [sec] =&gt; 1386675421
                    [usec] =&gt; 0
                )
            [length] =&gt; 179952
            [chunkSize] =&gt; 262144
            [md5] =&gt; 768d618923442668ca2a60f02be59d52
        )
    [gridfs:protected] =&gt; MongoGridFS Object
        (
            [w] =&gt; 1
            [wtimeout] =&gt; 10000
            [chunks] =&gt; MongoCollection Object
                (
                    [w] =&gt; 1
                    [wtimeout] =&gt; 10000
                )
            [filesName:protected] =&gt; images.files
            [chunksName:protected] =&gt; images.chunks
        )
    [flags] =&gt; 0
)

然而,结果的正文内容是:

<img style="-webkit-user-select: none" src="http://localhost/path-to/the-script.php">

有什么想法吗?为什么?

谢谢!

基于您的第一个代码示例(混合HTML和PHP),您正在HTML本身中回显图像的字节。还有一个问题是在发送响应体之后调用header()header()PHP文档中首先讨论的内容之一)。我假设您的意思是拥有一个<img>标记,其src属性指向一个单独的PHP脚本,该脚本只需设置Content-type标头并返回图像字节。

如果你真的想在页面响应中输出图像字节,你应该考虑使用数据URI:

  • 数据URI方案:使用PHP包含在HTML或CSS中
  • 堆栈溢出:嵌入Base64图像

但是,将src属性指向PHP脚本可能是更好的选择(尤其是对于大型图像)。我无法解释您的原始脚本是如何生成的:

<img style="-webkit-user-select: none" src="http://localhost/path-to/the-script.php">

但这肯定是你在这里的目标。

关于MongoGridFSFile::getBytes()的使用,您应该注意getResource()将更高效,尤其是对于大图像。使用该资源可以通过一次只在内存中加载两个块(来自GridFS)来减少内存消耗。这里可以找到一个使用getResource()输出文件内容的简明示例。