使用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包版本不匹配也会引发这类问题。
解决方案
替换为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修正导入语句
确保代码中导入的是v3版本的Upload类:import { S3Client } from "@aws-sdk/client-s3"; import { Upload } from "@aws-sdk/lib-storage";修正后的完整代码
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
相关产品推荐
相关产品推荐

