我是Node.js的新手。任何人都可以提供一个如何使用GridFS来存储和检索使用Node.js和Mongoose的二进制数据(如图像)的示例吗?我是否需要直接访问GridFS?
答案 0 :(得分:21)
我对这里评分最高的答案不满意,所以我提供了一个新答案: 我最终使用节点模块'gridfs-stream'(那里有很棒的文档!),可以通过npm安装。 有了它,并与猫鼬结合,它可能看起来像这样:
var fs = require('fs');
var mongoose = require("mongoose");
var Grid = require('gridfs-stream');
var GridFS = Grid(mongoose.connection.db, mongoose.mongo);
function putFile(path, name, callback) {
var writestream = GridFS.createWriteStream({
filename: name
});
writestream.on('close', function (file) {
callback(null, file);
});
fs.createReadStream(path).pipe(writestream);
}
请注意,path是本地系统上文件的路径。
至于我对该文件的读取功能,对于我的情况,我只需要将文件流式传输到浏览器(使用快递):
try {
var readstream = GridFS.createReadStream({_id: id});
readstream.pipe(res);
} catch (err) {
log.error(err);
return next(errors.create(404, "File not found."));
}
答案 1 :(得分:8)
我建议看一下这个问题:Problem with MongoDB GridFS Saving Files with Node.JS
从答案中复制的例子(信用证转到christkv):
// You can use an object id as well as filename now
var gs = new mongodb.GridStore(this.db, filename, "w", {
"chunk_size": 1024*4,
metadata: {
hashpath:gridfs_name,
hash:hash,
name: name
}
});
gs.open(function(err,store) {
// Write data and automatically close on finished write
gs.writeBuffer(data, true, function(err,chunk) {
// Each file has an md5 in the file structure
cb(err,hash,chunk);
});
});
答案 2 :(得分:7)
答案到目前为止都是好的,但是,我认为在此处记录如何使用官方mongodb nodejs driver而不是依赖于进一步的抽象(例如" gridfs-stream"
之前的一个答案确实使用了官方的mongodb驱动程序,但他们使用的是Gridstore API;已弃用,请参阅here。我的示例将使用新的GridFSBucket API。
这个问题非常宽泛,因此我的答案将是整个nodejs程序。这将包括设置快速服务器,mongodb驱动程序,定义路由以及处理GET和POST路由。
GET照片路径将Mongo ObjectID作为参数来检索图像。
我配置multer以将上传的文件保存在内存中。这意味着照片文件不会随时写入文件系统,而是直接从内存流式传输到GridFS。
/root/.ssh/authorized_keys
我写了一篇关于这个主题的博客文章;是我的答案的详细说明。可用here
进一步阅读/启发:
答案 3 :(得分:3)
看起来,writeBuffer已被弃用。
/Users/kmandrup/private/repos/node-mongodb-native/HISTORY:
82 * Fixed dereference method on Db class to correctly dereference Db reference objects.
83 * Moved connect object onto Db class(Db.connect) as well as keeping backward compatibility.
84: * Removed writeBuffer method from gridstore, write handles switching automatically now.
85 * Changed readBuffer to read on Gridstore, Gridstore now only supports Binary Buffers no Strings anymore.