所以我有这段代码:
downloadFile(file_id) { return new Promise((resolve, reject) => { var mongoose = require('mongoose'); var Grid = require('gridfs-stream'); var fs = require('fs'); mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e)); var conn = mongoose.connection; Grid.mongo = mongoose.mongo; var gfs = Grid(conn.db); console.log('downloadfile', file_id); var read_stream = gfs.createReadStream({_id: file_id}); let file = []; read_stream.on('data', function (chunk) { file.push(chunk); }); read_stream.on('error', e => { console.log(e); reject(e); }); return read_stream.on('end', function () { resolve(file); }); }); }
我这样称呼它:
Account.findById(req.params._id) .then(async account => { const file = await functions.downloadFile(account.employer.logo); res.render('users/employer/booth', { title: 'Employer Booth', user: req.user, postings: postings, employer: account.employer, event: event, logo: logo, }); });
如何将该文件保存到服务器并用作图像,或者仅将其发送到视图并在<img>标签中显示?
<img>
我试图做这样的事情:
read_stream.on('open', function () { var imgFile = fs.createWriteStream(`/public/images/logos/${file_id}.jpg`); var write_stream = read_stream.pipe(imgFile); read_stream.pipe(res); }); read_stream.on('error', e => { console.log(e); });
但这无法读取已保存的文件,并且文件也未保存在任何地方。
好的,这挽救了我的生命:https : //youtu.be/pXHOF4GWuZQ。这是最终代码:
downloadFile(file_id) { return new Promise((resolve, reject) => { var mongoose = require('mongoose'); var Grid = require('gridfs-stream'); var fs = require('fs'); mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e)); var conn = mongoose.connection; Grid.mongo = mongoose.mongo; var gfs = Grid(conn.db); console.log('downloadfile', file_id); var read_stream = gfs.createReadStream({_id: file_id}); let file = []; read_stream.on('data', function (chunk) { file.push(chunk); }); read_stream.on('error', e => { console.log(e); reject(e); }); return read_stream.on('end', function () { file = Buffer.concat(file); const img = `data:image/png;base64,${Buffer(file).toString('base64')}`; resolve(img); }); }); }