AWS S3 - 获取 PDF 作为八位字节流并上传到 S3 存储桶
AWS S3 - Fetch PDF as octet-stream and upload to S3 bucket
我正在从第 3 方 API 获取 PDF。响应内容类型为 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 下载文件也会生成包含空白页的文件。有人知道我哪里错了吗?
正如@Micheal - sqlbot 在评论中提到的那样,下载是问题所在。我没有从 API 获取整个字节流。
改变const payload = await get('someUrl').catch(handleError);
至
import * as request from 'request'; // notice I've imported the base request lib
let bufferArray = [];
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
库。
我正在从第 3 方 API 获取 PDF。响应内容类型为 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 下载文件也会生成包含空白页的文件。有人知道我哪里错了吗?
正如@Micheal - sqlbot 在评论中提到的那样,下载是问题所在。我没有从 API 获取整个字节流。
改变const payload = await get('someUrl').catch(handleError);
至
import * as request from 'request'; // notice I've imported the base request lib
let bufferArray = [];
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
库。