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

如何使用AWS S3 v3 JavaScript SDK暂停与恢复大文件分片上传?

AWS v3 JS SDK分片上传:暂停恢复与凭证自动刷新方案

一、分片上传的暂停与恢复实现

AWS SDK v3的Upload()封装没有内置暂停/恢复能力,可基于底层分片API自行实现:

  • 暂停逻辑:
    停止当前分片的上传请求,保存关键状态:Bucket名称、对象Key、上传ID(UploadId)、已上传分片的编号(PartNumber)和对应的ETag。状态可存在本地存储(浏览器用localStorage,Node.js用文件)。
  • 恢复逻辑:
    1. 调用ListPartsCommand传入保存的Bucket、Key和UploadId,获取服务端已记录的分片列表
    2. 对比本地保存的已上传分片,过滤掉已完成的部分
    3. 依次上传剩余分片,全部完成后调用CompleteMultipartUploadCommand收尾

二、角色链临时凭证的透明刷新

针对角色链会话1小时有效期的限制,通过自定义凭证提供者实现自动刷新:

  1. 编写一个异步函数,负责获取/刷新临时凭证:
    • 检查当前凭证是否存在或即将过期(建议提前5分钟触发刷新)
    • 调用AssumeRoleCommand获取新的临时凭证,记录过期时间
  2. 将该函数作为凭证提供者传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:02:52