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

如何通过boto3为AWS S3预签名URL设置上传文件大小限制

错误原因

你当前调用create_presigned_url时传入的client_method为put_object,对应S3的PUT上传模式:

  • put_object接口本身不存在ContentLengthRange参数,因此触发参数校验失败
  • PUT模式仅支持通过ContentLength参数固定要求上传文件的字节数,无法实现大小区间限制
解决方案

要实现200KiB~1024KiB的文件大小范围校验,需要改用POST模式的预签名URL,使用generate_presigned_post方法生成签名,大小限制规则放在Conditions参数中:

# 单位换算:1KiB = 1024字节
MIN_SIZE = 200 * 1024  # 204800字节
MAX_SIZE = 1024 * 1024 # 1048576字节

presigned_post = await s3_client.generate_presigned_post(
    Bucket=settings.S3_Bucket,
    Key=f"application/registration/{find_application_id.get('application_id')}/{req_upload_document.document_type}/{first_char}{time_reformat}.jpg",
    # 上传限制规则放在此处
    Conditions=[
        ["content-length-range", MIN_SIZE, MAX_SIZE]
    ],
    # 预签名有效期,单位为秒,可按需调整
    ExpiresIn=3600
)
客户端上传说明

生成的presigned_post返回值包含两个核心字段:

  • url:POST请求的上传目标地址
  • fields:需要附带在POST表单中的所有签名参数

客户端需使用multipart/form-data格式提交请求,将fields内的所有键值对全部加入表单,最后添加file字段传入上传的文件即可。S3会自动校验文件大小是否符合指定范围,超出范围会直接拒绝上传。

特殊场景补充(必须使用PUT模式的情况)

如果你必须保留PUT模式的预签名URL,只能固定要求上传文件大小,无法做区间限制,生成签名时添加ContentLength参数即可,示例:

# 要求文件大小必须为512KiB,即524288字节
create_presigned_url = await s3_client.create_presigned_url(
    client_method="put_object",
    method_parameters={
        "Bucket": settings.S3_Bucket,
        "Key": "你的文件Key",
        "ContentLength": 524288,
    },
)

客户端上传时必须携带和该值完全一致的Content-Length请求头,否则上传会失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:54:07