在MongoDB数据库中存储图片

219

如何在MongoDB数据库中存储图像而不仅限于文本?我能否在MongoDB数据库中创建图像数组?同样的方法是否适用于视频?


3
简短回答:是的,如果你使用base64正确编码的话,可以存储(小)图片。参考链接:https://dev59.com/Wmgu5IYBdhLWcg3wRlL0 ,我也发现http://menge.io/2015/03/24/storing-small-images-in-mongodb/ 是一个很好的起点。 - B--rian
8个回答

134

请参阅GridFS文档,了解如何存储此类二进制数据的详细信息。

您特定语言的支持链接应该在屏幕底部提供。


55
除了可以处理大于16MB的文件外,使用GridFS相比于仅使用BinData类型还有哪些好处? - just a slime
6
视频文件大小通常会大于16MB,因此这个答案可能是合理的。然而,也许应该提到一下这一点。 - Chanoch
2
除了使用GridFS之外,还有其他的解决方案吗? - Abhishek Mani
3
另一个解决方案是根本不将它们存储在 MongoDB 中。现在,2018年起,将这些数据写入Amazon的S3或Azure BLOB存储之类的东西要简单得多。 - Gates VP
2
嘿@Nux,这个问题来自2011年,已经过去8年了。在2019年,对Brandon的问题的答案已经与实际不符。不要使用MongoDB来存储此类二进制数据,我们有更好的解决方案来高效地存储(和流式传输)数据。 - Gates VP
显示剩余4条评论

79

"如果文件大小超过 16MB,你应该始终使用 GridFS 进行存储" - 我何时应该使用 GridFS?

MongoDB BSON 文档的容量上限是 16 MB。因此,如果你的文件数组总大小小于等于此限制,可以使用 BinData 数据类型直接将它们存储在文档中。

无论是视频、图片、PDF、电子表格等等,都会被同等处理。你的应用程序需要返回适当的内容类型标头以显示它们。

请查看GridFS 文档以获取更多详细信息。


27

你可以尝试这个:

String newFileName = "my-image";
File imageFile = new File("/users/victor/images/image.png");
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
gfsFile.save();

14

安装以下库

var express = require(‘express’);
var fs = require(‘fs’);
var mongoose = require(‘mongoose’);
var Schema = mongoose.Schema;
var multer = require('multer');

连接您的MongoDB数据库:

mongoose.connect(‘url_here’);

定义数据库模式

var Item = new ItemSchema({ 
    img: { 
       data: Buffer, 
       contentType: String 
    }
 }
);
var Item = mongoose.model('Clothes',ItemSchema);
使用中间件Multer在服务器端上传照片。
app.use(multer({ dest: ‘./uploads/’,
  rename: function (fieldname, filename) {
    return filename;
  },
}));

向我们的数据库发送POST请求

app.post(‘/api/photo’,function(req,res){
  var newItem = new Item();
  newItem.img.data = fs.readFileSync(req.files.userPhoto.path)
  newItem.img.contentType = ‘image/png’;
  newItem.save();
});

先生,如果我想添加图像数组怎么办? - Nikhil Patil
@NikhilPatil,你可以像这样使用:var upload = multer({dest: 'uploads/'}); app.post('/api/photos/',upload.array('photos',12),function(req,res){...})请参阅Multer文档 - Karatheodory
我该如何从Mongo中显示图像? - Ragul CS

14

http://blog.mongodb.org/post/183689081/storing-large-objects-and-files-in-mongodb

有一个在NPM上的Mongoose插件叫做mongoose-file,它可以让你在Mongoose Schema中添加文件字段以进行文件上传。我从未使用过它,但它可能会证明很有用。 如果图像非常小,您可以对它们进行Base64编码,并将字符串保存到数据库中。

Storing some small (under 1MB) files with MongoDB in NodeJS WITHOUT GridFS

在NodeJS中使用MongoDB存储一些小于1MB的文件而不使用GridFS。


10
你可以使用二进制数据类型来在MongoDB中存储文件/图片,如果你使用的是任何脚本语言。二进制数据被开发用于存储小型文件。
请参考你所使用的脚本语言驱动程序。对于PHP,请点击这里

9

你可以在MongoDB中存储文件吗?

可以。

但是,你应该在MongoDB中存储文件吗?

不应该。


MongoDB不适合用于存储文件。如果你需要存储文件,应该使用像Amazon S3或Google Cloud Storage这样的存储服务。

最佳做法是将文件存储在存储服务中,并只在MongoDB中保存上传图像的URI。


1
虽然我同意,云存储并不总是一个选项。因此你可以使用GridFS - OneCricketeer

3
var upload = multer({dest: "./uploads"});
var mongo = require('mongodb');
var Grid = require("gridfs-stream");
Grid.mongo = mongo;

router.post('/:id', upload.array('photos', 200), function(req, res, next){
gfs = Grid(db);
var ss = req.files;
   for(var j=0; j<ss.length; j++){
     var originalName = ss[j].originalname;
     var filename = ss[j].filename;
     var writestream = gfs.createWriteStream({
         filename: originalName
     });
    fs.createReadStream("./uploads/" + filename).pipe(writestream);
   }
});

在您的观点中:

<form action="/" method="post" enctype="multipart/form-data">
<input type="file" name="photos">

使用此代码,您可以在MongoDB中添加单个或多个图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接