AWS S3 - извлечение PDF в виде октетного потока и загрузка в корзину S3 - PullRequest
0 голосов
/ 26 февраля 2019

Я загружаю PDF из стороннего API.Тип содержимого ответа application/octet-stream.После этого я загружаю его на S3, но если я перехожу на S3 и загружаю вновь записанный файл, содержимое не отображается, страницы остаются пустыми, просматриваются в Chromium и Adobe Acrobat.Файл также не является нулевым байтом и имеет правильное количество страниц.

Использование двоичной кодировки дает мне размер файла, ближайший к фактическому размеру файла.Но это все еще не точно, это немного меньше.

Запрос API (с использованием модуля request-promise):

import { get } from 'request-promise';

const payload = await get('someUrl').catch(handleError);

const buffer = Buffer.from(payload, 'binary');
const result = await new S3().upload({
  Body: buffer,
  Bucket: 'somebucket',
  ContentType: 'application/pdf',
  ContentEncoding: 'binary',
  Key: 'somefile.pdf'
}).promise();

Кроме того, загрузка файла из Postman также приводит к созданию файла с пустыми страницами.Кто-нибудь знает, где я иду не так?

1 Ответ

0 голосов
/ 27 февраля 2019

Как упоминалось в комментариях @Micheal - sqlbot, проблема была в загрузке.Я не получил весь поток байтов от API.

Изменение const payload = await get('someUrl').catch(handleError);

на

import * as request from 'request'; // notice I've imported the base request lib 

let arrayBuffer = [];

request.get('someUrl')
.on('response', (res) => {

  res.on('data', (chunk) => {
    bufferArray = bufferArray.concat(Buffer.from(chunk)); //save response in a temp array for now
  });

  .on('end', () => {
    const dataBuffer = Buffer.concat(bufferArray); //this now contains all my data
    //send to s3
  });
});

Примечание: не рекомендуется передавать ответы с библиотекой request-promise, как указано в документации.Вместо этого я использовал базовую библиотеку request.

https://github.com/request/request-promise#api-in-detail

...