如何在gcloud-aio-storage客户端库的upload方法中传入ACL?
解决gcloud-aio-storage上传图片至GCS并设置公开访问的问题
针对你使用gcloud-aio-storage 9.2.0版本上传图片到Google Cloud Storage(GCS)并需要设置公开访问的需求,你可以通过以下两种方式实现:
方式一:上传时通过请求头设置权限
gcloud-aio-storage的upload方法支持通过headers参数传递自定义HTTP请求头,你可以添加x-goog-acl头来指定预定义权限:
import asyncio from gcloud.aio.auth import Token from gcloud.aio.storage import Storage async def upload_image(bucket_name, image_name, data): SCOPES = ["https://www.googleapis.com/auth/devstorage.read_write"] token = Token(service_file="key.json", scopes=SCOPES) async with Storage(token=token) as client: # 添加x-goog-acl请求头设置公开可读 headers = {"x-goog-acl": "public-read"} image = await client.upload( bucket=bucket_name, object_name=image_name, file_data=data, headers=headers ) await token.close() return image["name"]
这个请求头会直接告知GCS将上传的对象设置为公开可读权限,无需额外操作。
方式二:上传后单独设置ACL
如果上传时没设置权限,也可以在上传完成后调用set_acl方法来修改对象权限:
import asyncio from gcloud.aio.auth import Token from gcloud.aio.storage import Storage async def upload_image(bucket_name, image_name, data): SCOPES = ["https://www.googleapis.com/auth/devstorage.read_write"] token = Token(service_file="key.json", scopes=SCOPES) async with Storage(token=token) as client: image = await client.upload( bucket=bucket_name, object_name=image_name, file_data=data ) # 上传后设置公开可读ACL await client.set_acl("publicRead", bucket_name, image_name) await token.close() return image["name"]
注意这里的权限参数是"publicRead"(驼峰格式),和请求头里的"public-read"(短横线分隔)对应不同的参数格式,需要匹配方法要求。
为什么直接传acl参数无效?
gcloud-aio-storage 9.x版本的upload方法并没有暴露acl或predefined_acl这类直接参数,所以你之前尝试的acl='publicRead'不会生效,必须通过上述两种方式来设置权限。
内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

