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

如何共享S3文件夹中的对象并生成其预签名链接?

S3 预签名URL批量生成相关问题解答

是否需要为每个对象单独生成链接?

是的,必须为每个对象单独生成预签名URL。S3里没有真正的“文件夹”概念,所谓的文件夹只是对象Key里的前缀而已,每个对象都是独立的资源。预签名URL是基于单个对象的权限、Key和签名参数生成的,没法直接为整个前缀下的所有对象生成一个通用链接。你可以通过遍历前缀下的对象列表,批量生成对应的预签名URL。

如何通过JavaScript SDK创建这些链接?

使用AWS SDK v3(推荐)

先调用ListObjectsV2获取指定前缀下的所有对象,再遍历每个对象用getSignedUrl生成预签名URL:

import { S3Client, ListObjectsV2Command, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

// 初始化S3客户端
const s3Client = new S3Client({ region: "你的AWS区域" });

async function getFolderPresignedUrls(bucketName, folderPrefix) {
  // 注意prefix要以/结尾,比如"shared/reports/",避免匹配到类似"shared/reports-xxx"的对象
  const listCmd = new ListObjectsV2Command({
    Bucket: bucketName,
    Prefix: folderPrefix,
    Delimiter: "/" // 可选,过滤掉前缀下的虚拟文件夹,只返回文件对象
  });

  const { Contents } = await s3Client.send(listCmd);
  if (!Contents?.length) return [];

  // 批量生成URL,用Promise.all并行处理提升效率
  return Promise.all(
    Contents.map(async (obj) => {
      const getCmd = new GetObjectCommand({
        Bucket: bucketName,
        Key: obj.Key
      });
      // 设置有效期,单位秒,这里示例为24小时
      const presignedUrl = await getSignedUrl(s3Client, getCmd, { expiresIn: 86400 });
      return {
        fileName: obj.Key.split("/").pop(),
        url: presignedUrl,
        lastUpdated: obj.LastModified
      };
    })
  );
}

// 调用示例
getFolderPresignedUrls("my-bucket", "shared/documents/")
  .then(urlList => console.log("生成的预签名URL列表:", urlList))
  .catch(err => console.error("生成失败:", err));

使用AWS SDK v2

如果还在使用旧版SDK,逻辑类似:

const AWS = require('aws-sdk');
const s3 = new AWS.S3({ region: "你的AWS区域" });

async function getFolderPresignedUrlsV2(bucketName, folderPrefix) {
  const listParams = {
    Bucket: bucketName,
    Prefix: folderPrefix
  };
  const { Contents } = await s3.listObjectsV2(listParams).promise();
  if (!Contents?.length) return [];

  return Contents.map(obj => {
    const signedParams = {
      Bucket: bucketName,
      Key: obj.Key,
      Expires: 86400 // 有效期24小时,单位秒
    };
    const presignedUrl = s3.getSignedUrl('getObject', signedParams);
    return { fileName: obj.Key.split("/").pop(), url: presignedUrl };
  });
}

链接的有效期能否超过12小时?

当然可以,默认情况下,用长期IAM用户凭证生成的预签名URL最长有效期可达7天(604800秒)。不过有两个限制条件需要注意:

  • 如果使用的是临时凭证(比如STS角色、ECS任务角色的临时凭证),预签名URL的有效期不能超过临时凭证本身的剩余有效期。
  • 如果你的AWS账户有自定义IAM策略限制了s3:GetObject操作的预签名URL有效期,那必须遵循该策略的限制。

只要满足上述条件,设置超过12小时的有效期完全没问题,比如设置24小时甚至7天都可以。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:23:17