将图像存储在 MongoDB 数据库中

问题描述 投票:0回答:9

如何在 MongoDB 数据库中存储图像而不仅仅是文本?我可以在 MongoDB 数据库中创建图像数组吗?视频也可以做同样的事情吗?

mongodb database
9个回答
135
投票

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

对您的特定语言的支持应链接到屏幕底部。


80
投票

“您应该始终使用 GridFS 来存储大于 16MB 的文件” - 我什么时候应该使用 GridFS?

MongoDB BSON 文档 的上限为 16 MB。因此,如果文件数组的总大小小于该值,您可以使用 BinData 数据类型将它们直接存储在文档中。

视频、图像、PDF、电子表格等 - 没关系,它们都被同等对待。由您的应用程序返回适当的内容类型标头来显示它们。

查看 GridFS 文档了解更多详细信息。


28
投票

你可以试试这个:

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
投票

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

NPM 上有一个名为 mongoose-file 的 Mongoose 插件。它允许您将文件字段添加到 Mongoose 架构中以进行文件上传。我从未使用过它,但它可能会很有用。 如果图像非常小,您可以对其进行 Base64 编码并将字符串保存到数据库中。

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


14
投票

安装以下库

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

连接你的 mongo 数据库:

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;
  },
}));

将请求发布到我们的数据库

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();
});

10
投票

可以在 MongoDB 中存储文件吗?

是的。

你应该将文件存储在 MongoDB 中吗?

没有。


MongoDB 不是 存储文件的好地方。如果您想存储文件,您应该使用 Amazon S3 或 Google Could Storage 等存储。

好的做法是将文件存储在存储中,然后将上传图像的 URI 保存在 MongoDB 中。


10
投票

如果您使用任何脚本语言在 MongoDB 中存储文件/图像,则可以使用 bin 数据类型。 Bin数据是为了存储小尺寸文件而开发的。

请参阅您的脚本语言驱动程序。对于 PHP,请单击此处


4
投票
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 中添加单个以及多个图像。


0
投票
  1. 将图像存储为 Base64 字符串 将所选图像转换为 Base64 字符串并将其作为字符串存储在 MongoDB 中。 优点:简单并且避免处理文件存储。 缺点:由于 Base64 编码增加了约 33% 的开销,因此显着增加了数据库大小。 示例:

`const image = wait ImagePicker.launchImageLibraryAsync({ base64: true }); const base64Image = image.base64;

//保存到MongoDB const imageDocument = { 图像:base64Image }; 等待 db.collection('images').insertOne(imageDocument);`

© www.soinside.com 2019 - 2024. All rights reserved.