【问题标题】:MongoDB GridFS image not loaded correctlyMongoDB GridFS 图像未正确加载
【发布时间】:2013-12-27 22:07:13
【问题描述】:

我正在尝试使用 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">

有什么想法吗?

谢谢!

【问题讨论】:

  • 结果内容是图片标签?
  • 是的,我不知道实际应该发生什么,但我猜一个img标签,其中src属性是php文件的路径不是它^^
  • 我真的不知道这怎么可能......

标签: php image mongodb src gridfs


【解决方案1】:

根据您的第一个代码示例(混合 HTML 和 PHP),您将在 HTML 本身中回显图像的字节。还有一个问题是在发送响应正文后调用header()header() PHP docs 中讨论的第一件事)。我假设你的意思是有一个&lt;img&gt; 标记,其src 属性指向一个单独的PHP 脚本,该脚本简单地设置Content-type 标头并返回图像字节。

如果您确实打算在页面响应中输出图像字节,则应考虑使用数据 URI:

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

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

...但这当然是您应该在这里的目标。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2016-09-25
    • 2021-03-18
    • 2018-02-25
    相关资源
    最近更新 更多