Подавать файл xlsx из двоичного файла MongoDB, используя Node.js - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть несколько документов Excel (xlsx), сохраненных в MongoDB в двоичном формате.Я хотел бы, чтобы node.js извлекал файл из базы данных, когда пользователь переходит на URL, и предоставляет файл для загрузки пользователем.Я успешно загружаю файл a , но при попытке открыть файл получаю сообщение об ошибке 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.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 голосов
/ 16 ноября 2018

Я понял это.Мне просто нужно было использовать 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') );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...