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

