首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongodb中的Gridfs

mongodb中的Gridfs
EN

Stack Overflow用户
提问于 2013-06-15 09:32:32
回答 1查看 1.7K关注 0票数 1

最近,我们在mongodb中集成了Gridfs来存储图像。对于我的需求,以前我们使用NFS来获取或存储目录中的图像。对于图像来说,它变得更慢了。所以我们整合了GridFS。

GridFS,但现在我要澄清的是,如何在单个请求上获取多个图像并在浏览器中显示?因为我们在mongodb网格分割中填充了接近1L的照片。但是我不能在单次请求中获取多个图像。

下面给出的示例代码。-以下代码将只返回一张照片。我无法在单次请求中获取所有图像。如果有人面临这样的问题,请与我们分享。

方法1:只返回一个图像。

代码语言:javascript
运行
复制
$mongo = new Mongo("192.168.0.8:27017");
$db = $mongo->myfiles;
$gridFS = $db->getGridFS();
$cursor = $gridFS->find()->limit(10); - it will return one than one images
/*$cursor  = $gridFS->find(array("metadata.memberid"=>"CMD34123")); - it will return one than one images, because the member having more than one images.*/

foreach ($cursor as $obj)
{                   
        header("Content-Type: image/jpg");
        $stream = $obj->getResource();

        while (!feof($stream)) {
                echo fread($stream, 51200);
        }
}

方法2:返回所有图像,但与NFS一样,每个映像都将获取每个HTTP。没有拯救。

代码语言:javascript
运行
复制
$mongo = new Mongo("192.168.0.8:27017");
$db = $mongo->myfiles;
$gridFS = $db->getGridFS();
$cursor = $gridFS->find()->limit(10);
foreach ($cursor as $obj)
       echo "<img src='getphoto.php?filename=".$obj->getFilename()."'>";

getphoto.php:

代码语言:javascript
运行
复制
$mongo = new Mongo("192.168.0.8:27017");
$db = $mongo->myfiles;
$gridFS = $db->getGridFS();
/*$image = $gridFS->findOne($_REQUEST['filename']);*/
header("Content-Type: image/jpg");
echo $stream = $image->getResource();
while (!feof($stream)) 
        echo fread($stream, 51200);
EN

回答 1

Stack Overflow用户

发布于 2013-06-27 21:46:53

我不明白如何在一个请求中返回多个文件,除非您使用一个PHP的压缩和存档扩展将它们组合成一个文件,而该文件又被转发为HTTP。

如果图像很小,另一种选择是将它们作为base64 64编码数据URI嵌入到HTML中。这种技术通常用于在CSS background-image值中嵌入小图像(图标大小);但是,它不适合大图像,因为存储开销相当高。

关于第一个代码示例中的查询:

代码语言:javascript
运行
复制
$gridFS->find(array("metadata.memberid"=>"CMD34123"))

我知道这一行被注释掉了,但是如果您正在运行这样的查询,我建议对metadata.memberid进行索引,以避免扫描fs.files集合中的每个文档。

您正在进行的迭代尝试连续打印几个JPG图像的内容类型、标题和字节内容。PHP的标头()函数不能以这种方式多次调用。

您可能可以利用多部分HTTP响应发送多个映像,但浏览器支持可能会出现问题(请参阅:这是几年前的问题)。

在您的getphoto.php源代码中,您打算使用字符串参数调用MongoGridFS::findOne()。您应该知道,用户可以利用查询字符串,以便$_REQUEST['filename']实际上是一个数组(参见:这篇关于这个主题的文章)。在将请求参数传递给findOne()之前,最好检查请求参数和/或将其转换为字符串。

此外:

  • 这将对filename字段进行查询,因此您应该确保对其进行索引。
  • 根据fs.files 规格说明filename字段是可选的,不一定是唯一的。GridFS中的多个文件很可能具有相同的文件名。

考虑到以上几点,可能更容易使用ObjectId的24个十六进制字符作为请求参数,构造MongoId,并在_id字段上进行查询(或使用MongoGridFS::get())。在本例中,我前面关于验证请求参数的要点仍然有效--它将允许您使用默认的_id索引。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17122155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档