繁体   English   中英

使用从 AWS S3 getObject 读取 Stream 读取并上传到不同的存储桶

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM