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

使用aws-sdk/lib-storage的Upload.done()时遇TypeError错误求助

解决AWS S3分片上传中TypeError: Cannot read properties of undefined (reading 'done')错误

问题根源

你使用了AWS SDK v3的S3Client,但大概率导入了v2版本的aws-sdk/lib-storage中的Upload类,两者API不兼容,导致内部处理分片流时出现对象未定义的错误。另外,v3与v2包版本不匹配也会引发这类问题。

解决方案

  1. 替换为v3的分片上传包
    卸载v2的aws-sdk(若已安装),安装v3的@aws-sdk/lib-storage和@aws-sdk/client-s3,确保两者版本一致:

    npm uninstall aws-sdk
    npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
    
  2. 修正导入语句
    确保代码中导入的是v3版本的Upload类:

    import { S3Client } from "@aws-sdk/client-s3";
    import { Upload } from "@aws-sdk/lib-storage";
    
  3. 修正后的完整代码

    async multipartUpload(event: any) {
      const file = event.target[0].files[0];
      if (!file) return;
    
      const creds = {
        accessKeyId: this.ACCESS_KEY,
        secretAccessKey: this.SECRET_ACCESS_KEY
      };
      const target = {
        Bucket: this.BUCKET_NAME,
        Key: file.name,
        Body: file
      };
    
      const s3Client = new S3Client({
        region: "ap-south-1",
        credentials: creds
      });
    
      try {
        const parallelUploads3 = new Upload({
          client: s3Client,
          params: target,
          // 可选:自定义分片大小与并发数
          partSize: 10 * 1024 * 1024, // 10MB
          queueSize: 4
        });
    
        parallelUploads3.on("httpUploadProgress", (progress) => {
          console.log(`上传进度:${Math.round((progress.loaded / progress.total) * 100)}%`);
        });
    
        const result = await parallelUploads3.done();
        console.log("上传完成", result);
      } catch (e) {
        console.error("上传失败", e);
      }
    }
    

额外排查点

  • 确认IAM用户拥有s3:PutObject和s3:ListBucket权限(分片上传需列表桶权限管理分片)
  • 检查S3桶的CORS规则,确保允许当前域名发起PUT请求

内容的提问来源于stack exchange,提问作者Jacob Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:50:29