首页 > 解决方案 > 如何使用 gcloud-aio-storage 上传和获取自定义元数据?

问题描述

我正在使用 gcloud-aio-storage 缓存文件。有一个选项可以在上传功能中添加元数据字典

async def upload(self, bucket: str, object_name: str, file_data: Any,
                 *, content_type: Optional[str] = None,
                 parameters: Optional[Dict[str, str]] = None,
                 headers: Optional[Dict[str, str]] = None,
                 metadata: Optional[Dict[str, Any]])

还有一个下载元数据的功能 async def download_metadata(self, bucket: str, object_name: str,

应该能够添加元数据并稍后使用上述功能检索它。我究竟做错了什么?

标签: pythongoogle-cloud-platformgoogle-cloud-storage

解决方案


据我了解,您想上传一个带有自定义元数据的对象,然后在需要时检索它。

如果您将键值对传递给如下所示,则不会添加自定义元数据upload()

metadata_dict = {
  "foo" : "bar",
  "color": "green"
}

metadata原因是因为库正在字典中寻找键。请参阅此处的代码片段。我查看了库,在这种情况下,请求正文变为:

{"foo": "bar", "color": "green", "name": "filename.txt"}

正确的地方必须是:

{"metadata": {"foo": "bar", "color": "green"}, "name": "filename.txt"}

解决方案是像这样配置您的字典:

meta_dict = {
    "metadata":{
      "foo" : "bar",
      "color": "green"
    }
}

完整代码示例(归功于原始答案):

import asyncio
import aiohttp
# pip install aiofile
from aiofile import AIOFile
# pip install gcloud-aio-storage
from gcloud.aio.storage import Storage 
import logging
import sys

BUCKET_NAME = 'BUCKET_NAME'
FILE_NAME  = 'FILE_NAME.txt'
meta_dict = {
    "metadata":{
      "foo" : "bar",
      "color": "green"
    }
}
async def async_upload_to_bucket(blob_name, file_obj, meta_dict):
    async with aiohttp.ClientSession() as session:
        storage = Storage(session=session) 
        status = await storage.upload(BUCKET_NAME, blob_name, file_obj, metadata=meta_dict)
        print(status['metadata'])
        return status['selfLink']

async def main():
    async with AIOFile(FILE_NAME, mode='r') as afp:
        f = await afp.read()
        url = await async_upload_to_bucket(FILE_NAME, f, meta_dict)
        print(url)


# Python 3.7+
asyncio.run(main()) 
print("success")

推荐阅读