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

如何使用Node.js为Amazon S3存储的图片生成永久有效URL

解决Amazon S3签名URL有效期限制,生成永久有效URL的方案

你目前使用的getSignedUrl生成的是临时授权URL,默认有效期为15分钟,要实现永久有效直至对象删除的URL,有两种可行方案:

方案一:将S3对象设为公开可读(简单直接)

通过给上传的对象添加公开读权限,直接使用S3的静态访问URL,只要对象存在就可永久访问。

修改后的上传代码

module.exports.uploadImage = async (request, response) => {
  try {
    const file = request?.files?.image;
    if (!file) {
      return response.status(400).json({
        status: false,
        message: "Please upload Image",
        data: null,
      });
    }
    const { id } = request.body;
    const extension = file.name.split(".")[file.name.split(".").length - 1];
    const currentDate = new Date().getTime(); // 替换getMilliseconds()避免重复
    const key = `${id ? id : currentDate}-${uuidv4()}.${extension}`;
    
    await new Upload({
      client: s3Client,
      params: {
        Bucket: config.AWS_BUCKET_NAME,
        Key: key,
        Body: Buffer.from(file.data, "binary"),
        ContentType: file.mimetype,
        ContentDisposition: "inline",
        ACL: 'public-read' // 添加公开读权限
      },
    }).done();

    // 构造永久公开URL
    const permanentUrl = `https://${config.AWS_BUCKET_NAME}.s3.${config.AWS_REGION}.amazonaws.com/${key}`;

    return response.status(201).send({ status: true, data: permanentUrl });
  } catch (exc) {
    console.log(exc);
    return response.status(500).json({
      status: false,
      message: "Something went wrong",
      data: null,
    });
  }
};

注意事项

  • 此方案适合完全公开的资源,所有知道URL的用户都能访问对象
  • 若S3桶存在全局访问限制,需确保桶策略允许对象的公开读权限

方案二:使用CloudFront + Origin Access Control(推荐,兼顾安全)

通过CloudFront CDN分发S3内容,利用Origin Access Control(OAC)确保只有CloudFront能访问私有S3桶,CloudFront的分发URL永久有效,且对象始终保持私有状态。

前置配置

  1. 创建CloudFront分发,关联你的S3桶,启用OAC(替代旧版OAI)
  2. 配置S3桶权限,允许CloudFront OAC访问桶内对象

修改后的上传代码

只需将生成URL的部分替换为CloudFront域名:

// 替换为你的CloudFront分发域名,例如d1234567890abc.cloudfront.net
const permanentUrl = `https://${config.CLOUDFRONT_DOMAIN}/${key}`;

优势

  • S3对象保持私有,仅通过CloudFront分发访问
  • 可利用CloudFront的缓存、全球加速功能优化访问性能
  • 支持通过CloudFront配置额外的访问控制(如WAF、签名Cookie)

两种方案下,当S3对象被删除时,对应的URL都会失效,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:13:15