![](/img/trans.png)
[英]getObject from AWS s3 bucket using Javascript SDK: “missing credential” error
[英]Use Read Stream from AWS S3 getObject to read and upload to a different bucket
我正在尝试从.gz
格式的第三方 AWS S3 存储桶中读取文件。 我需要处理文件中的数据并将文件上传到我们自己的 S3 Bucket。
为了读取文件,我正在从 S3.getBucket 创建一个 readStream,如下所示:
const fileStream = externalS3.getObject({Bucket: <bucket-name>, Key: <key>}).createReadStream();
为了使代码更高效,我计划使用相同的fileStream
来处理内容并上传到我们自己的 S3。 我有下面的代码,它不会将文件上传到内部 S3 存储桶。
import Stream from "stream";
const uploadStream = fileStream.pipe(new stream.PassThrough());
const readStream = fileStream.pipe(new stream.PassThrough());
await internalS3.upload({Bucket:<bucket-name>, Key: <key>, Body: uploadStream})
.on("httpUploadProgress", progress => {console.log(progress)})
.on("error", error => {console.log(error)})
.promise();
readStream.pipe(createGunzip())
.on("error", err =>{console.log(err)})
.pipe(JSONStream.parse())
.on("data", data => {console.log(data)});
但是,下面的代码成功地将文件上传到内部 s3 存储桶。
const uploadStream = fileStream.pipe(new stream.PassThrough());
await internalS3.upload({Bucket:<bucket-name>, Key: <key>, Body: uploadStream})
.on("httpUploadProgress", progress => {console.log(progress)})
.on("error", error => {console.log(error)})
.promise();
我在这里做错了什么?
注意:如果我使用单独的fileStream
上传和读取数据,它工作正常。 但是,我需要使用相同的 fileStream 来实现这一点。
如 OP 所述,您尝试上传到 S3 的文件具有相对较大的大小 (~1 GB)。 这里正在创建两个流,通过管道传输单个fileStream
:
const uploadStream = fileStream.pipe(new stream.PassThrough());
const readStream = fileStream.pipe(new stream.PassThrough());
虽然readStream
上的操作耗时较少,但uploadStream
负责将文件上传到远程位置,在本例中为 S3,通过网络上传,这需要相对更多的时间。 这也意味着readStream
正在以更高的速率从fileStream
中提取/请求数据。 到readStream
完成时, fileStream
已经被消耗,对aws sdk
的.upload
调用挂起。 看到这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.