如何在Google Cloud Storage v4签名URL中限制文件上传大小?
解决GCS V4签名URL限制上传文件大小的问题
V4版本的签名URL不再支持V2中的conditions参数,要实现文件大小限制,需通过绑定请求头约束的方式完成,具体方案如下:
核心逻辑
GCS V4签名URL会对请求的关键要素(请求方法、资源路径、指定请求头等)进行签名,客户端必须严格匹配这些要素才能完成上传。我们可以将x-goog-content-length-range请求头加入签名约束,强制客户端上传时指定文件大小范围,GCS会自动校验文件实际大小是否符合该范围。
修改后的代码实现
将原代码中的conditions参数替换为headers,指定x-goog-content-length-range头的取值:
# 修改后的签名URL生成代码 from google.cloud import storage from django.conf import settings from datetime import timedelta class GcsHandler: def __init__(self): self.bucket_name = settings.GS_BUCKET_NAME self.storage_client = storage.Client() self.bucket = self.storage_client.bucket(self.bucket_name) def generate_signed_url(self, blob_name: str, content_type: str, file_size: int) -> str: """ Generate a signed URL for a blob to upload a file with a specific size limit. :param blob_name: The path to the GCS file. :param content_type: The content type of the file. :param file_size: The exact file size limit for the upload. :return: The signed URL. """ blob = self.bucket.blob(blob_name) # 构造大小限制的请求头,格式为"min_size,max_size",此处设为精确大小 size_range_header = f"{file_size},{file_size}" url = blob.generate_signed_url( version="v4", expiration=timedelta(minutes=60), method="PUT", content_type=content_type, # 指定必须包含的请求头,将大小限制加入签名约束 headers={ "x-goog-content-length-range": size_range_header } ) return url
客户端上传要求
使用生成的签名URL上传文件时,必须在请求中携带x-goog-content-length-range头,且取值要和签名时指定的一致,否则GCS会拒绝请求。示例curl命令:
curl -X PUT -H "Content-Type: image/jpeg" -H "x-goog-content-length-range: 1024,1024" --data-binary @test.jpg "生成的签名URL"
补充说明
- 若需允许一定的大小范围(如100KB到1MB),只需将
size_range_header设为"102400,1048576"即可。 - 该方式通过签名验证确保客户端无法篡改大小限制参数,保证约束的有效性。
内容的提问来源于stack exchange,提问作者Nori
相关产品推荐
相关产品推荐

