Php mongodb中的Gridfs

Php mongodb中的Gridfs,php,mongodb,mongoose,gridfs,Php,Mongodb,Mongoose,Gridfs,最近,我们在mongodb中集成了Gridfs来存储图像。根据我的要求,以前我们使用NFS在目录中获取或存储图像。一段时间内,速度越来越慢。所以我们集成了GridFS GridFS,但现在我要澄清的是,我们如何在一次请求中获得多次图像并在浏览器中显示?。因为我们在mongodb gridfs分片中填充了近1L张照片。但是我不能在一次请求中获取多个图像 下面给出了示例代码。-下面的代码将只返回一张照片。我无法在一次请求中获取所有图像。如果有人面临此类问题,请与我们分享 方法1:它只返回一个图像 $

最近,我们在mongodb中集成了Gridfs来存储图像。根据我的要求,以前我们使用NFS在目录中获取或存储图像。一段时间内,速度越来越慢。所以我们集成了GridFS

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

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

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

$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请求。没有储蓄

$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()."'>";

我不知道如何在一个请求中返回多个文件,除非使用一个PHP将它们组合成一个文件,然后作为HTTP响应转发

如果图像很小,另一种方法是将它们嵌入HTML中。该技术通常用于在CSS
背景图像
值中嵌入小图像(图标大小);但是,它不适合大图像,因为存储开销相当高


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

$gridFS->find(array("metadata.memberid"=>"CMD34123"))
我知道这一行被注释掉了,但是如果您正在运行这样的查询,我建议为
metadata.memberid
编制索引,以避免扫描
fs.files
集合中的每个文档

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

您可以利用发送回多个图像,但浏览器支持可能存在问题(请参阅)


getphoto.php
源代码中,您打算使用字符串参数调用。您应该知道,用户可以利用查询字符串,从而使
$\u REQUEST['filename']
实际上是一个数组(请参阅:)。在将请求参数传递给
findOne()
之前,最好检查请求参数并/或将其转换为字符串

此外:

  • 这将查询
    文件名
    字段,因此您应该确保它已编制索引
  • 根据
    fs.files
    filename
    字段是可选的,不一定是唯一的。GridFS中的多个文件很可能具有相同的文件名
考虑到以上几点,只使用ObjectId的24个十六进制字符作为请求参数,构造一个,并在
\u id
字段(或使用)上使用该字符进行查询可能更容易。我之前关于验证请求参数的观点在本例中仍然有效——它允许您使用默认的
\u id
索引

$gridFS->find(array("metadata.memberid"=>"CMD34123"))