python - 如何从云功能的谷歌存储桶中以二进制模式打开文件?
问题描述
在我的云功能中,我需要在云存储中获取文件并通过 HTTP POST 请求将文件发送到 API。我尝试了以下代码:
storage_client = storage.Client()
bucket = storage_client.bucket(BUCKET_NAME)
source_blob_name = "/compressed_data/file_to_send.7z"
blob = bucket.blob(source_blob_name)
url = UPLOADER_BACKEND_URL
files = {'upload_file': blob}
values = {'id': '1', 'ouid': OUID}
r = requests.post(url, files=files, data=values)
它给出了一个错误说:
Traceback (most recent call last): File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker_v2.py", ...
\ line 90, in encode_multipart_formdata body.write(data) TypeError: a bytes-like object is required, not 'Blob'
如果此代码要在实际 VM 上运行,则以下内容将起作用:
url = UPLOADER_BACKEND_URL
files = {'upload_file': open('/tmp/file_to_send.7z','rb')}
values = {'id': '1', 'name': 'John'}
r = requests.post(url, files=files, data=values)
所以问题是:在云函数中,如何从云存储中加载文件,使其具有与 pythonopen(filename, 'rb')
函数相同的输出?
我知道我可以做blob.download_to_file()
然后open()
文件,但我想知道是否有更快的方法。
解决方案
在您的 Cloud Functions 参考中,您不向 API 调用提供 Blob 内容,而只提供 Blob 参考(文件路径 + 存储桶名称)。
您确实可以在内存文件系统/tmp
目录中本地下载文件。然后将此 tmp 文件作为任何文件处理。上传后别忘了删除!!
您还可以尝试使用 python 惯用方式处理文件的gcsfs
库。我在调用 API 时从未尝试过这样做,但它应该可以工作。
推荐阅读
- c# - 当用户从浏览器下载 msi 时,如何将参数与 msi 一起传递?
- angular - 如何动态地从角度 6 中的嵌套 json 对象中获取值?
- python - crontab 重启权限
- python - 遍历 Python 字典并特殊追加到新列表?
- javascript - 从客户端使用变量加载文件
- php - Laravel 框架 php 中的路由冲突
- c# - 使用 32feet 库发现蓝牙设备的奇怪行为
- asp.net - 应用程序从 .net core 2.1 迁移到 3.0
- java - 写入标准输出很慢,为什么仍然建议登录标准输出?
- flutter - Navigator.push 将在 Navigator.push 之后关注目标页面上的文本字段时再次调用