javascript - Cambiar un búfer de un ReadStream en un archivo real
node.js express (1)
Ok, esto me salvó la vida: https://youtu.be/pXHOF4GWuZQ . Este es el código final:
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);
});
});
}
Así que tengo este código:
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);
});
});
}
Y lo estoy llamando así:
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,
});
});
¿Cómo puedo guardar este archivo en el servidor y servirlo como una imagen, o simplemente enviarlo a la vista y mostrarlo en una etiqueta
<img>
?
Intenté hacer algo como esto:
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);
});
Pero esto no pudo leer el archivo guardado, y el archivo no se guardó en ninguna parte.