保存通过GridFS下载的文件以在网站上使用

时间:2018-10-31 11:31:45

标签: javascript node.js mongodb gridfs

所以我有这段代码:

downloadFile: async (req, res) => {
    var mongoose = require('mongoose');
    var Grid = require('gridfs-stream');
    mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e));
    var conn = mongoose.connection;
    Grid.mongo = mongoose.mongo;
    var gfs = Grid(conn.db);
    var file_id = req.params.logoId;
    console.log(file_id);
    return gfs.files.find({_id: file_id}).toArray(function (err, files) {
        if (err) {
            console.log(err);
        }
        if (files.length > 0) {
            console.log(files[0]);
            var mime = files[0].contentType;
            var filename = files[0].filename;
            res.set('Content-Type', mime);
            res.set('Content-Disposition', "inline; filename=" + filename);
            var read_stream = gfs.createReadStream({_id: file_id});
            read_stream.pipe(res);
            return res;
        } else {
            console.log('File not found')
        }
    });
}

执行该命令会使我的浏览器通过浏览器下载物理文件。我如何重定向它以保存在服务器上(?)并将其用作网站上的徽标?

1 个答案:

答案 0 :(得分:0)

您当前正在从gfs中读取文件,并通过管道传递到响应。 相反,您可以简单地通过管道传递到文件:

var read_stream = gfs.createReadStream({_id: file_id});
var imgFile = fs.createWriteStream("images/logos/logo.jpg");
var write_stream = read_stream.pipe(imgFile);

此操作应在服务器启动时执行。如果文件只是徽标,我认为在请求内执行不是一个好主意。 但是,如果仍然希望在请求中执行此操作,则需要处理流finish事件,并且仅在write_stream处理完文件后返回响应:

write_stream.on("finish", function() { 
  ...
  res.send(...);
});