升级aws-sdk至v3后S3流式上传报NotImplemented错误如何解决
AWS SDK v3 实现S3流式上传解决方案
你遇到的NotImplemented报错原因如下:
AWS SDK v3中PutObjectCommand本身不支持未知长度的流式上传:当你传入未指定长度的流作为Body时,SDK会自动添加Transfer-Encoding: chunked请求头,但S3原生的PutObject接口不支持分块传输编码,因此触发该错误。
v2中s3.upload方法默认会自动处理流式上传的分块逻辑,v3中对应的能力被拆分到独立的@aws-sdk/lib-storage包的Upload类中。
实现步骤
- 第一步:安装必要依赖
npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
- 第二步:修改业务代码
const { S3Client } = require("@aws-sdk/client-s3"); const { Upload } = require("@aws-sdk/lib-storage"); const stream = require('stream'); const s3Client = new S3Client({ region: "us-east-1" }); function get_s3_stream() { const pass = new stream.PassThrough(); // 实例化Upload类,完全对应v2的s3.upload能力 const uploadTask = new Upload({ client: s3Client, params: { Bucket: "bucketname", Key: "testfile2.txt", Body: pass }, // 可选配置:分块大小(单位字节,默认5MB)、并发上传数 partSize: 10 * 1024 * 1024, queueSize: 4 }); // 异步监听上传结果(不需要可以删除) uploadTask.done() .then(data => console.log('上传成功', data)) .catch(err => console.error('上传失败', err)); return pass; }; // 测试代码 const inputStream = stream.Readable.from(["input string2"]); const outStream = get_s3_stream(); inputStream.pipe(outStream);
注意事项
- 不要直接await
uploadTask.done()返回的Promise再返回流,否则会阻塞流的返回,异步监听结果即可。 - 如果需要中途取消上传,可以调用
uploadTask.abort()方法。
内容的提问来源于stack exchange,提问作者Jon Wilson
相关产品推荐
相关产品推荐

