我有一些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
有人知道如何进行这项工作吗?预先感谢!
答案 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') );