You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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);

注意事项

  • 不要直接awaituploadTask.done()返回的Promise再返回流,否则会阻塞流的返回,异步监听结果即可。
  • 如果需要中途取消上传,可以调用uploadTask.abort()方法。

内容的提问来源于stack exchange,提问作者Jon Wilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:27:06