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

如何使用Python生成强制下载对象的AWS S3预签名URL

强制S3预签名URL触发下载的Python实现

要实现预签名URL访问时强制下载而非浏览器直接预览,只需要在调用generate_presigned_url方法时额外传入ResponseContentDisposition参数即可,该参数会指定S3返回响应时携带对应Content-Disposition响应头。

完整代码示例

import boto3
from botocore.exceptions import ClientError

def generate_presigned_download_url(bucket_name, object_key, download_filename, expiration=3600):
    """
    生成强制触发下载的S3预签名URL
    :param bucket_name: S3存储桶名称
    :param object_key: S3对象的键
    :param download_filename: 用户下载时默认保存的文件名
    :param expiration: URL有效期,单位秒,默认3600秒即1小时
    :return: 预签名URL,生成失败返回None
    """
    s3_client = boto3.client('s3')
    try:
        response = s3_client.generate_presigned_url(
            ClientMethod='get_object',
            Params={
                'Bucket': bucket_name,
                'Key': object_key,
                # 核心参数:指定Content-Disposition响应头,强制触发下载
                'ResponseContentDisposition': f'attachment; filename="{download_filename}"'
            },
            ExpiresIn=expiration
        )
    except ClientError as e:
        print(f"生成预签名URL失败: {e}")
        return None

    return response

# 调用示例
url = generate_presigned_download_url(
    bucket_name='你的存储桶名',
    object_key='存储桶里的对象路径/xxx.pdf',
    download_filename='用户下载时显示的文件名.pdf',
    expiration=3600
)
print(url)

注意事项

  • 如果你生成的预签名URL是给未授权的匿名用户访问的,请确保S3对象本身的权限允许该用户读取,或者存储桶策略、IAM权限配置了对应s3:GetObject权限
  • download_filename如果包含中文、特殊符号,建议先做URL编码处理,避免不同浏览器解析文件名时出现乱码
  • 该方法仅针对get_object类型的预签名URL生效,上传类的预签名URL不适用此参数
  • 如果你使用的Python版本低于3.6,将代码中的f-string替换为'attachment; filename="%s"' % download_filename格式即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:27:05