Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS S3-获取PDF作为八位字节流并上传到S3存储桶_Node.js_Amazon Web Services_Amazon S3_Request Promise_Octetstring - Fatal编程技术网

Node.js AWS S3-获取PDF作为八位字节流并上传到S3存储桶

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

我正在从第三方API获取PDF。响应内容类型为
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
  });
});