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

