У меня есть некоторые документы Excel (xlsx), сохраненные в MongoDB в двоичном формате. Я хотел бы, чтобы node.js извлекал файл из базы данных, когда пользователь переходит по URL-адресу, и предоставлял файл для загрузки пользователем. Я успешно загружаю файл а, но при попытке открыть файл из Excel выдает сообщение об ошибке:
«Excel не может открыть файл '5beec8ef3cf3e70b5ce8972e.xlsx', потому что формат файла или расширение файла недопустимы. Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла».
Файл также сохраняется с 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.info('type of doc.file: ' + typeof doc.file);
// returns:
// type of doc.file: object
console.info(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
Кто-нибудь знает, как заставить эту работу? Заранее спасибо!





Я понял. Мне просто нужно было использовать doc.file.buffer и заключить имя файла в двойные кавычки (").
Я нашел здесь буферный ответ: Как сохранить файл в Mongodb с помощью 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') );
Новое объявление Buffer теперь помечено как устаревшее. Теперь вы можете использовать Buffer.alloc (число) или Buffer.from (строка)