Node.js AWS S3-获取PDF作为八位字节流并上传到S3存储桶
我正在从第三方API获取PDF。响应内容类型为Node.js AWS S3-获取PDF作为八位字节流并上传到S3存储桶,node.js,amazon-web-services,amazon-s3,request-promise,octetstring,Node.js,Amazon Web Services,Amazon S3,Request Promise,Octetstring,我正在从第三方API获取PDF。响应内容类型为application/octet-stream。此后,我将其上传到S3,但如果我转到S3并下载新编写的文件,则内容不可见,页面为空白,在Chromium和Adobe Acrobat中查看。该文件也不是零字节,并且具有正确的页数 使用二进制编码可以得到一个最接近实际文件大小的文件大小。但它仍然不精确,它稍微小一点 API请求(使用请求承诺模块): 此外,从邮递员处下载文件也会产生一个带有空白页的文件。有人知道我哪里出错了吗?正如@Micheal-sq
application/octet-stream
。此后,我将其上传到S3,但如果我转到S3并下载新编写的文件,则内容不可见,页面为空白,在Chromium和Adobe Acrobat中查看。该文件也不是零字节,并且具有正确的页数
使用二进制编码可以得到一个最接近实际文件大小的文件大小。但它仍然不精确,它稍微小一点
API请求(使用请求承诺
模块):
此外,从邮递员处下载文件也会产生一个带有空白页的文件。有人知道我哪里出错了吗?正如@Micheal-sqlbot在评论中提到的,下载是问题所在。我没有从API获取整个字节流 更改
const payload=wait get('someUrl').catch(handleError)代码>
到
注意:不建议使用文档中概述的请求承诺
库对响应进行流式处理。我使用了基本的request
库
请注意,二进制文件
不是内容编码
的首选项,因此指定二进制文件
应等同于不指定任何内容。有效值为gzip
br
deflate
compress
和identity
(相当于根本不指定任何值)。这应该设置为与原始服务作为内容编码
发送给您的内容相同,除非您可以证明他们设置不正确,就像他们对内容类型
所做的那样,但这似乎不太可能。Buffer.from(有效负载,'binary')代码>。。。那么,payload
最初是一个字符串?这似乎有潜在的问题,但我想这取决于你是如何下载的。我们可能需要看看那个代码。根据当前可用的信息,下载似乎比上传更有可能是原始问题产生的地方。@Michael sqlbot,感谢您的见解。我已经更新了这个问题。我现在意识到我并不是在阅读整个响应负载。。。我想我的下载只会抓住第一块。
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();
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
});
});