Подавать файл xlsx из двоичного файла MongoDB с помощью Node.js

У меня есть некоторые документы 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

Кто-нибудь знает, как заставить эту работу? Заранее спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
421
1

Ответы 1

Я понял. Мне просто нужно было использовать 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 (строка)

Kevin Oswaldo 16.06.2021 17:25

Другие вопросы по теме