#javascript #node.js #pdf #amazon-s3
Вопрос:
Я получаю ответ в узле, чтобы получить PDF-файл, в котором я хотел бы сохранить двоичные данные и загрузить их в S3, который затем я могу извлечь, как мне заблагорассудится, для исторических целей. Прямо сейчас у меня возникли проблемы с извлечением этих необработанных данных PDF/двоичных данных, чтобы я мог сохранить их в формате PDF и загрузить, я думаю, что приближаюсь. это и есть ответ.тело, которое я получаю.
PassThrough {
_readableState: ReadableState {
objectMode: false,
highWaterMark: 16384,
buffer: BufferList { head: null, tail: null, length: 0 },
length: 0,
pipes: null,
pipesCount: 0,
flowing: null,
ended: false,
endEmitted: false,
reading: false,
sync: false,
needReadable: false,
emittedReadable: false,
readableListening: false,
resumeScheduled: false,
emitClose: true,
autoDestroy: false,
destroyed: false,
defaultEncoding: 'utf8',
awaitDrainWriters: null,
multiAwaitDrain: false,
readingMore: false,
decoder: null,
encoding: null,
[Symbol(kPaused)]: null
},
readable: true,
_events: [Object: null prototype] {
prefinish: [Function: prefinish],
unpipe: [Function: onunpipe],
error: [ [Function: onerror], [Function] ],
close: [Function: bound onceWrapper] { listener: [Function: onclose] },
finish: [Function: bound onceWrapper] { listener: [Function: onfinish] }
},
_eventsCount: 5,
_maxListeners: undefined,
_writableState: WritableState {
objectMode: false,
highWaterMark: 16384,
finalCalled: false,
needDrain: false,
ending: false,
ended: false,
finished: false,
destroyed: false,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,
corked: 0,
sync: true,
bufferProcessing: false,
onwrite: [Function: bound onwrite],
writecb: null,
writelen: 0,
afterWriteTickInfo: null,
bufferedRequest: null,
lastBufferedRequest: null,
pendingcb: 0,
prefinished: false,
errorEmitted: false,
emitClose: true,
autoDestroy: false,
bufferedRequestCount: 0,
corkedRequestsFree: {
next: null,
entry: null,
finish: [Function: bound onCorkedFinish]
}
},
writable: true,
allowHalfOpen: true,
_transformState: {
afterTransform: [Function: bound afterTransform],
needTransform: false,
transforming: false,
writecb: null,
writechunk: null,
writeencoding: null
},
[Symbol(kCapture)]: false
}
Это мой код:
platform.on(platform.events.loginSuccess, async function(e) {
let resp = await platform.get('/restapi/v1.0/account/~/extension/' accountId '/message-store', {
messageType: ['Fax'],
dateFrom: ['2021-05-01'],
dateTo: ['2021-05-16']
})
let jsonObj = await resp.json()
let attachId = jsonObj.records[0].id
let getMessageContent = await platform.get('/restapi/v1.0/account/~/extension/' accountId '/message-store/' attachId '/content/' attachId, {
contentDisposition: ['Inline']
})
Я знаю, что ответ, который я получаю, правильный, потому что, если я запущу этот URL в postman и использую опцию предварительного просмотра, я смогу увидеть pdf (см. Скриншот). Что я упускаю?
Ответ №1:
По-моему, это выглядит примерно правильно. Ответ.тело — это читаемый node.js поток, содержащий двоичные данные, и я предполагаю, что Почтальон автоматически считывает этот поток и отображает результат.
Хорошей новостью является то, что этот тип потока является именно тем, что S3 хочет использовать в качестве тела запроса при загрузке файлов, а это означает, что вам не нужно никуда его сохранять — вы можете просто передать его непосредственно в S3. В зависимости от вашей реализации ваш код может выглядеть примерно так:
const result = await s3Client.upload({
Bucket: 'MY_S3_BUCKET',
Key: 'myfilename.pdf',
Body: response.body,
}).promise();
Где ответ.тело — это поток, который вы зарегистрировали выше. Это должно поместить pdf-файл прямо в S3, готовый для загрузки.
Но если вы настаиваете на сохранении файла, вы также можете передать поток в метод fs.writeFileSync следующим образом:
fs.writeFileSync('my-pdf.pdf', response.body);