javascript - 将缓冲区从 ReadStream 更改为实际文件

标签 javascript node.js express gridfs

所以我有这个代码:

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,
        });
    });

如何将此文件保存到服务器并将其作为图像提供,或者只是将其发送到 View 并在 <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);
        });
    });
}

关于javascript - 将缓冲区从 ReadStream 更改为实际文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53211432/

相关文章:

node.js - 异常的通用捕获版本?

javascript - 删除 d3 map 中的阿拉斯加和夏威夷

mysql - 使用npm mysql模块,在windows下查询源及路径问题

javascript - 如何将 document.querySelectorAll() 转换为 ReactJS?

javascript - JS 应用程序与 gmail API 一起使用 - 客户端还是服务器端?

node.js - 为什么 connect-mongo 为每个请求创建新 session ?

javascript - Node API等待外部数据

node.js - 使用 Express.js 设置持久性 cookie

javascript - youtube视频播放完后如何自动退出浏览器

javascript - 提示时如何禁用textarea中的文本