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

AWS S3预签名URL二维码实现图片直接下载问题咨询

解决S3扫码直接下载图片的问题

核心问题

你当前的代码生成的是上传文件到S3的预签名URL(调用put_object),但你需要的是从S3下载文件的预签名URL,这就是扫码后没有触发下载的根本原因。

修正方案

修改代码生成下载用的预签名URL,同时正确配置Content-Disposition响应头,让设备识别为附件并触发下载提示:

def generate_download_presigned_url(self, object_key, bucket_name, filename, expiration_time=3600):
    """生成从S3下载文件的预签名URL,触发自动下载"""
    try:
        # 配置响应头,指定为附件并设置文件名(处理特殊字符)
        content_disposition = f'attachment; filename="{quote_plus(filename)}"'
        params = {
            'Bucket': bucket_name,
            'Key': object_key,
            'ResponseContentDisposition': content_disposition
        }
        # 生成get_object的预签名URL(用于下载)
        presigned_url = self.s3_client.generate_presigned_url(
            'get_object',
            Params=params,
            ExpiresIn=expiration_time
        )
        return {
            'download_signed_url': presigned_url,
            'filename': filename
        }
    except Exception as e:
        print(f"生成下载预签名URL出错: {e}")
        return None

关键说明

  1. 替换操作类型:把put_object改为get_object,这是生成下载URL的核心。
  2. 响应头参数:使用ResponseContentDisposition而非ContentDisposition(后者是上传时的请求头,下载需要的是响应头)。
  3. 文件名处理:用quote_plus转义文件名中的特殊字符(比如空格、中文),避免下载时文件名乱码。
  4. 二维码内容:把生成的download_signed_url作为二维码的目标链接,而不是之前的public_url——因为public_url不会自动带上下载响应头。

额外注意事项

  • 确保S3对象已经成功上传到指定的object_key路径下。
  • 预签名URL的过期时间要覆盖用户扫码下载的预期时长,避免过期无法访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:27:02