所以我有这段代码:
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')
}
});
}
执行该命令会使我的浏览器通过浏览器下载物理文件。我如何重定向它以保存在服务器上(?)并将其用作网站上的徽标?
答案 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(...);
});