Я получаю отчет в формате 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. Нужно ли что-то делать перед загрузкой?? Почему он загружает только пустые страницы?
Спасибо
Откуда reportInfo.body
? Это должен быть буфер, большой двоичный объект или поток.
Он исходит из REST API. У вас есть предложения, что с этим делать?
Все дело в кодировании. В вашем сценарии файл представляет собой составной файл (pdf), который передается в aws через POST на URL-адрес.
Для кодирования или декодирования node.js вы должны обратиться к этому документу.
Еще одна конфигурация, которую необходимо выполнить, — параметры шлюза API должны быть правильно настроены для поддержки двоичных типов данных.
Путь: Консоль AWS --> Шлюз API --> Настройки --> multipart/form-data
Итак, что я должен сделать с этими данными, чтобы сделать их правильными? Кодировать в базу 64 и потом отправлять на s3? Не могли бы вы напечатать небольшой фрагмент в качестве предложения? Спасибо :D
Документ 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);
}
};
Прежде всего, не могли бы вы удалить нечитаемый контекст. В противном случае сообщество поднимет флаг против вашего вопроса.