如何使用AWS S3 v3 JavaScript SDK暂停与恢复大文件分片上传?
AWS v3 JS SDK分片上传:暂停恢复与凭证自动刷新方案
一、分片上传的暂停与恢复实现
AWS SDK v3的Upload()封装没有内置暂停/恢复能力,可基于底层分片API自行实现:
- 暂停逻辑:
停止当前分片的上传请求,保存关键状态:Bucket名称、对象Key、上传ID(UploadId)、已上传分片的编号(PartNumber)和对应的ETag。状态可存在本地存储(浏览器用localStorage,Node.js用文件)。 - 恢复逻辑:
- 调用
ListPartsCommand传入保存的Bucket、Key和UploadId,获取服务端已记录的分片列表 - 对比本地保存的已上传分片,过滤掉已完成的部分
- 依次上传剩余分片,全部完成后调用
CompleteMultipartUploadCommand收尾
- 调用
二、角色链临时凭证的透明刷新
针对角色链会话1小时有效期的限制,通过自定义凭证提供者实现自动刷新:
- 编写一个异步函数,负责获取/刷新临时凭证:
- 检查当前凭证是否存在或即将过期(建议提前5分钟触发刷新)
- 调用
AssumeRoleCommand获取新的临时凭证,记录过期时间
- 将该函数作为凭证提供者传入S3客户端配置,SDK会在每次请求前自动调用它获取有效凭证
示例代码:
const { S3Client } = require("@aws-sdk/client-s3"); const { AssumeRoleCommand, STSClient } = require("@aws-sdk/client-sts"); let currentCredentials; let expirationTime; // 处理并发刷新的锁 let refreshLock = false; const getCredentials = async () => { const now = new Date(); if (!currentCredentials || expirationTime - now < 5 * 60 * 1000) { // 避免并发请求重复刷新凭证 if (refreshLock) { await new Promise(resolve => setTimeout(resolve, 100)); return getCredentials(); } refreshLock = true; try { const stsClient = new STSClient({ /* 基础凭证配置 */ }); const command = new AssumeRoleCommand({ RoleArn: "你的角色ARN", RoleSessionName: "s3-upload-session", DurationSeconds: 3600 // 角色链场景下最大1小时 }); const { Credentials } = await stsClient.send(command); currentCredentials = Credentials; expirationTime = new Date(Credentials.Expiration); } finally { refreshLock = false; } } return { accessKeyId: currentCredentials.AccessKeyId, secretAccessKey: currentCredentials.SecretAccessKey, sessionToken: currentCredentials.SessionToken }; }; // 使用自定义凭证提供者创建S3客户端 const s3Client = new S3Client({ credentials: getCredentials });
内容的提问来源于stack exchange,提问作者Kyle Wahl
相关产品推荐
相关产品推荐

