最近,我们在mongodb中集成了Gridfs来存储图像。对于我的需求,以前我们使用NFS来获取或存储目录中的图像。对于图像来说,它变得更慢了。所以我们整合了GridFS。
GridFS,但现在我要澄清的是,如何在单个请求上获取多个图像并在浏览器中显示?因为我们在mongodb网格分割中填充了接近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()."'>";getphoto.php:
$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);发布于 2013-06-27 21:46:53
我不明白如何在一个请求中返回多个文件,除非您使用一个PHP的压缩和存档扩展将它们组合成一个文件,而该文件又被转发为HTTP。
如果图像很小,另一种选择是将它们作为base64 64编码数据URI嵌入到HTML中。这种技术通常用于在CSS background-image值中嵌入小图像(图标大小);但是,它不适合大图像,因为存储开销相当高。
关于第一个代码示例中的查询:
$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索引。
https://stackoverflow.com/questions/17122155
复制相似问题