使用Node.js从MongoDB二进制文件中提供xlsx文件

时间:2018-11-16 16:43:08

标签: node.js mongodb binary

我有一些Excel文档(xlsx)以二进制形式保存在MongoDB中。我希望node.js在用户导航到url并提供文件供用户下载时从数据库中检索文件。我已经成功下载了 a 文件,但是尝试打开文件时从Excel中收到错误消息:

“ Excel无法打开文件'5beec8ef3cf3e70b5ce8972e.xlsx',因为文件格式或文件扩展名无效。请验证文件未损坏且文件扩展名与文件格式匹配。” < / em>

文件也保存为0字节。我认为在尝试创建缓冲区之前,我没有正确转换MongoDB中的数据。这是我的脚本:

app.get('//downloadReport/:id', (req, res) => {
    dbo = db.db('test');
    dbo.collection("reports").findOne(
        {'_id': mongodb.ObjectId(req.params.id)}
    ).then(doc => {

        console.log('type of doc.file: ' + typeof doc.file);
        // returns:
        // type of doc.file: object

        console.log(doc.file);
        // returns:
        // Binary {
        //   _bsontype: 'Binary',
        //   sub_type: 0,
        //   position: 1146504,
        //   buffer: <Buffer 50 4b 03 04 14 00 00 00 08 00 12 66 6f 4d f8 64 19 ... > }


        res.writeHead(200, [['Content-Type',  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']]);

        // This one doesn't work
        // res.end(doc.file, 'binary');
        // returns:
        // TypeError: First argument must be a string or Buffer

        res.end(new Buffer(doc.file, 'binary') );
    });
});

我尝试向下钻取到doc.file.Binary.buffer,但收到一条错误消息,提示未定义doc.file.Binary

我还希望使用正确的文件名下载文件。我尝试将其添加到writeHead

['Content-disposition', 'filename=' + doc.filename]

但是我在Chrome中遇到错误:ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION

有人知道如何进行这项工作吗?预先感谢!

1 个答案:

答案 0 :(得分:0)

我知道了。我只需要使用doc.file.buffer并在文件名两边加上双引号(")。

我在这里找到了缓冲区的答案:How to save file in Mongodb using Node.js

    res.writeHead(200, {
      'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'Content-Disposition': 'attachment; filename="' + doc.filename + '"'
    });

    res.end(new Buffer(doc.file.buffer, 'binary') );