如何共享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
相关产品推荐
相关产品推荐

