python - 如何使用 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,
应该能够添加元数据并稍后使用上述功能检索它。我究竟做错了什么?
解决方案
据我了解,您想上传一个带有自定义元数据的对象,然后在需要时检索它。
如果您将键值对传递给如下所示,则不会添加自定义元数据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")
推荐阅读
- android - 如何将数组附加到firestore中的数组字段中?
- r - R中的核密度估计器
- python - 错误:命令出错,退出状态为 1:(帮助!!!)
- python - 在 Python 中解析嵌套和复杂的 XML
- zigbee - 如何在家庭助理中将 philips hue 网格与 mqtt 网格合并?
- html - 为什么 Fontawesone-Icon 没有出现?
- php - 完整性约束违规:1452 无法添加或更新子行 laravel 6
- javascript - 在页面加载时从迭代对象调用 JS 函数
- java - 尝试在 HTTP 请求中提交 JSON 正文会产生 java.io.FileNotFoundException
- c - 在 C 中覆盖一个 char[]