如何將圖像存儲在MongoDB數據庫而不是文本中?我可以在MongoDB數據庫中創建一個圖像陣列嗎?是否有可能爲視頻做同樣的事情?將圖像存儲在MongoDB數據庫中
109
A
回答
78
有關存儲此類二進制數據的詳細信息,請參閱GridFS文檔。
支持您的特定語言應該鏈接到屏幕的底部。
46
「你應該總是使用GridFS的存儲比16MB更大的文件」 - When should I use GridFS?
的MongoDB BSON documents在16 MB被封。因此,如果文件數組的總大小小於此值,可以使用BinData數據類型將它們直接存儲在文檔中。
視頻,圖片,PDF文件,電子表格等 - 沒關係,它們都是一樣的。這取決於您的應用程序返回適當的內容類型標題以顯示它們。
查看GridFS documentation瞭解更多詳情。
15
你可以試試這個:
String newFileName = "my-image";
File imageFile = new File("https://stackoverflow.com/users/victor/images/image.png");
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
gfsFile.save();
9
http://blog.mongodb.org/post/183689081/storing-large-objects-and-files-in-mongodb
上有NPM可用貓鼬插件叫做貓鼬文件。它允許您將文件字段添加到Mongoose架構以進行文件上載。我從來沒有使用過它,但它可能是有用的。 如果圖像非常小,您可以使用Base64對它們進行編碼並將字符串保存到數據庫。
Storing some small (under 1MB) files with MongoDB in NodeJS WITHOUT GridFS
5
,如果您使用任何腳本語言的文件/圖片存儲在MongoDB中您可以使用垃圾桶的數據類型。 Bin數據的開發是爲了存儲小尺寸的文件。
請參閱您的腳本語言驅動程序。對於PHP,請點擊here。
2
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中添加單以及多個圖像。保存圖片在後臺的NodeJS
-5
最佳途徑 - 專業推薦
var async = require('async');
var accessPath = path.join(__dirname, "../uploadLocation");
var folderName = new Date().getTime();
async.auto({
makeDir: function(next, results) {
makeDir(accessPath, folderName, next);
},
writeFile: ['makeDir', function(next, results) {
writeFile(accessPath, folderName, req.body.user.ImgData, req.body.user.email, next);
}],
}, function(err, success) {
if (err) {
console.log("error occurs while saving image")
} else {
console.log("success", success)
}
});
var makeDir = function(accessPath, folderName, next) {
try {
console.log("accessPath inside makeDir", accessPath, folderName)
fs.mkdirSync(accessPath + "/upload/user/" + folderName);
next(null, "done")
} catch (e) {
console.log("error in creating folder");
next(e, "Err")
}
}
var writeFile = function(accessPath, folderName, ImgData, email, next) {
var userImgName = email + ".jpg";
fs.writeFile(accessPath + "/upload/user/" + folderName + "/" + userImgName, ImgData, function(err, success) {
if (err) {
next(e, "Err")
} else {
console.log("success write file");
next(null, null);
}
});
}
GridFS的是文件> 16MB。並非所有的二進制數據都很大。除了能夠超越這個限制之外,使用GridFS而不是BinData類型還有其他好處嗎? – 2015-01-29 16:32:32