首页 > 解决方案 > 如何从云功能的谷歌存储桶中以二进制模式打开文件?

问题描述

在我的云功能中,我需要在云存储中获取文件并通过 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()文件,但我想知道是否有更快的方法。

标签: pythonfile-iogoogle-cloud-functionsgoogle-cloud-storage

解决方案


在您的 Cloud Functions 参考中,您不向 API 调用提供 Blob 内容,而只提供 Blob 参考(文件路径 + 存储桶名称)。

您确实可以在内存文件系统/tmp目录中本地下载文件。然后将此 tmp 文件作为任何文件处理。上传后别忘了删除!!

您还可以尝试使用 python 惯用方式处理文件gcsfs库。我在调用 API 时从未尝试过这样做,但它应该可以工作。


推荐阅读