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

如何实现S3存储桶图片对象URL无过期时间永久可访问?

问题根源

你当前使用的generate_presigned_url方法生成的是预签名临时URL,设计目的就是给私有资源提供有时效的临时访问权限,最长有效期确实只有7天,天生不支持永久有效。要实现永久访问,不需要走预签名逻辑,直接使用S3对象的原生公开访问路径即可。

实现步骤

1. 配置对象公开访问权限

注意:配置前需要先进入S3桶的「权限」设置页,关闭对应公共访问阻止规则:使用单对象ACL方案时,关闭“阻止通过访问控制列表(ACL)授予的对存储桶和对象的公共访问”;使用桶级策略方案时,关闭“阻止新的公共存储桶策略”和“阻止公共和跨账户访问”,否则公开权限不会生效。

根据你的权限管控需求,二选一配置即可:

  • (推荐,粒度更细)上传单对象时设置公开读权限:不需要修改整个桶的公开配置,仅将你上传的图片资源设置为公开可访问,桶内其他资源默认保持私有,安全风险更低。
  • (适合全桶存公开资源)配置桶级公开策略:如果整个存储桶专门用来存公开静态图片,可以直接配置桶策略,允许匿名用户读取桶内所有对象,上传时无需单独设置权限。

2. 修改业务代码

调整上传函数

上传对象时增加公开ACL参数,修改后的upload2s3代码如下:

def upload2s3(img_content, key_name):
    try:
        s3_conn = boto3.client(
            "s3",
            aws_access_key_id=AWS_ACCESS_KEY_ID,
            aws_secret_access_key=AWS_SECRET_KEY,
            region_name=AWS_S3_REGION_NAME  # 替换为实际桶所在区域,比如ap-northeast-1
        )
        # 上传时增加ACL参数,设置对象为公开读
        s3_conn.put_object(
            Bucket=BUCKET_NAME, 
            Body=img_content.read(), 
            Key=key_name,
            ACL='public-read'  # 单对象公开读权限,选择桶级方案时可删除该行
        )
        url = create_url(BUCKET_NAME, key_name)
        return url
    except Exception as ex:
        return {"status": False, "message": ex}

替换URL生成逻辑

完全移除预签名URL生成逻辑,直接拼接S3对象的永久访问路径,修改后的create_url代码如下:

def create_url(bucket, object_key):
    # 替换为实际桶所在区域,和初始化s3客户端时的区域保持一致
    region = AWS_S3_REGION_NAME
    # 拼接S3虚拟托管型永久URL,无签名参数、永不过期
    return f"https://{bucket}.s3.{region}.amazonaws.com/{object_key}"

桶级公开策略参考(可选)

如果选择全桶公开的方案,可以给桶配置如下策略(替换策略中的your-bucket-name为实际桶名):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

配置该策略后,上传对象时不需要再加ACL='public-read'参数,直接拼接永久URL即可访问。

最终效果

生成的永久URL格式为https://test_dir.s3.<你的桶所在区域>.amazonaws.com/XYZ.png,不再带有AWSAccessKeyId、Signature、Expires这类签名参数,无访问时效限制。

  • 如果后续搭配CDN加速静态资源,只需要把URL中的S3域名替换为你绑定的CDN加速域名即可,同样永久有效。
  • 如果后续需要给私有资源提供临时访问入口,再使用generate_presigned_url生成临时URL即可,公开静态资源直接使用上述永久URL方案即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:12:32