Загрузка PDF, полученного из API, напрямую в s3 в NodeJS

Я получаю отчет в формате PDF из стороннего API и хочу загрузить этот PDF-файл непосредственно в файл s3. Когда я это делаю, он загружает PDF в s3, но по какой-то причине, когда я открываю этот PDF в s3, все страницы пусты. Я делаю что-то не так? Мой код, как показано ниже.

var report = reportInfo.body;
const params = {
   Key: 'report.pdf',
   Body: report,
   Bucket: process.env.S3_BUCKET_NAME,
   ContentType: 'application/pdf',
};
s3.upload(params, (err, res) => {
   if (err) {
        console.info(err, 'err');
   }
    console.info(res, 'res');
});

Я назначаю ответ от API объекту отчета. Одна часть ответа выглядит так:

'%PDF-1.5\n%����\n1 0 obj<</Length 2872/Filter/FlateDecode>>поток\nx��\�n$�\r�����~�0� @� &1���>x�6�f���PU�U�a���mf���V�D�yHQ�փ��~$gF7�?���_/����� /��[�?��=�Ѓv����������F?u��ǿS3�d��k��:O�����X�k���2�k���\t˿ ?��������XY�Ի��Ti-3�y��y�u3�Q~���E?�g�����f_I4��'>>>�$�&�� ��e��G����0�1Go�@M��&�jҚ�YJ3�zmhz��0<�Q��n�۶�����i�\r5w�0�1�� �ѦO�5��SwM=�pm�����#f�>��q^g��j�J����}O�fi�xz&f�0�ǜ�^���yj� ��мм{�OM/B{z��%+��H�Ɣl4

Я думаю, что это обычный PDF-файл, и я могу напрямую загрузить его на s3. Нужно ли что-то делать перед загрузкой?? Почему он загружает только пустые страницы?

Спасибо

Прежде всего, не могли бы вы удалить нечитаемый контекст. В противном случае сообщество поднимет флаг против вашего вопроса.

Abdul Moeez 23.12.2020 22:00

Откуда reportInfo.body? Это должен быть буфер, большой двоичный объект или поток.

Michiel 23.12.2020 22:07

Он исходит из REST API. У вас есть предложения, что с этим делать?

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

Ответы 2

Все дело в кодировании. В вашем сценарии файл представляет собой составной файл (pdf), который передается в aws через POST на URL-адрес.

  • сервер получает файл с этим байтом -> 0010 (это не будет интерпретируется правильно, потому что стандартный байт имеет 8 бит)
  • Итак, мы кодируем его в базе 64 -> неважно, какой результат, декодируем его чтобы получить стандартный байт -> 0000 0010 (теперь это стандартный байт и правильно интерпретируется aws)

Для кодирования или декодирования node.js вы должны обратиться к этому документу.

Еще одна конфигурация, которую необходимо выполнить, — параметры шлюза API должны быть правильно настроены для поддержки двоичных типов данных.

Путь: Консоль AWS --> Шлюз API --> Настройки --> multipart/form-data

Итак, что я должен сделать с этими данными, чтобы сделать их правильными? Кодировать в базу 64 и потом отправлять на s3? Не могли бы вы напечатать небольшой фрагмент в качестве предложения? Спасибо :D

NeNaD 23.12.2020 23:55
Ответ принят как подходящий

Документ PDF должен быть получен как arraybuffer.

const axios = require('axios');

const fetchAndUploadPDF = async () => {
  try {
    const pdf_document = await axios({
      method: 'get',
      url: 'url_of_the_report',
      headers: {
        accept: 'application/pdf',
      },
      responseType: 'arraybuffer',
    });
   
    await s3.upload({
      Key: 'file_name',
      Body: pdf_document.data,
      Bucket: 'bucket_name',
      ContentType: 'application/pdf',
      ACL: 'public-read',
    })
    .promise();

    console.info('PDF document successfully fetched and uploaded');
  } catch (error) {
    console.info('ERROR: ', error.stack);
    throw(error);
  }
};

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