Pau*_*lin 3 amazon-s3 amazon-web-services node.js aws-lambda
我正在尝试编写一个 Lambda 函数,该函数将一个 S3 目录中的 zip 文件解压缩并解压缩到另一个目录中。我在 Python 中工作过,但我小组中没有其他人喜欢 Python,所以我将其转换为我不太擅长的 Node.js。
我正在尝试使用该unzipper包,并且能够使用 获取 zip 文件中的文件列表unzipper.Open.S3,但我不知道如何将 zip 文件中的文件流式传输到 S3 中。
代码的内容看起来像
const directory = await unzipper.Open.s3(s3,{Bucket: bucket, Key: zip_file});
directory.files.forEach(file => {
console.log("file name = " + file.path + ", type = " + file.type)
const key = dir[0] + "/output/" + file.path;
const params = { Bucket: bucket, Key: key };
const { writeStream, promise } = uploadStream(params)
file.stream().pipe(writeStream);
promise.then(() => {
console.log('upload completed successfully');
}).catch((err) => {
console.log('upload failed.', err.message);
});
});
const uploadStream = ({ Bucket, Key }) => {
const pass = new stream.PassThrough();
return {
writeStream: pass,
promise: s3.upload({ Bucket, Key, Body: pass }).promise()
};
}
Run Code Online (Sandbox Code Playgroud)
我得到了每个文件的 console.log,但都没有登录promise.then和.catch退出,S3 中也没有出现新文件。
没关系,我发现这个代码效果更好:
exports.handler = async (event) => {
const params = {
Key: zip_directory + "/" + zip_file,
Bucket: input_bucket
};
const zip = s3
.getObject(params)
.createReadStream()
.pipe(unzipper.Parse({ forceStream: true }));
const promises = [];
let num = 0;
for await (const e of zip) {
const entry = e;
const fileName = entry.path;
const type = entry.type;
if (type === 'File') {
const uploadParams = {
Bucket: output_bucket,
Key: output_directory + fileName,
Body: entry,
};
promises.push(s3.upload(uploadParams).promise());
num++;
} else {
entry.autodrain();
}
}
await Promise.all(promises);
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |