【问题标题】:How to open a file in binary mode in google storage bucket from cloud function?如何从云功能的谷歌存储桶中以二进制模式打开文件?
【发布时间】:2020-10-19 02:41:10
【问题描述】:

在我的云功能中,我需要在云存储中获取文件并通过 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)

所以问题是:在云函数中,如何从云存储中加载文件,使其具有与 python open(filename, 'rb') 函数相同的输出?

我知道我可以先blob.download_to_file() 然后open() 文件,但我想知道是否有更快的方法。

【问题讨论】:

    标签: python file-io google-cloud-functions google-cloud-storage


    【解决方案1】:

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

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

    您也可以尝试the gcsfs library,您可以在其中以python 惯用的方式处理文件。我在调用 API 时从未尝试过这样做,但它应该可以工作。

    【讨论】:

    • 感谢您的回答。当您说“不要忘记在上传后删除它”时,我有点困惑。我以为当云功能执行完毕后,本地文件会自动删除。为什么要删除/tmp/中的文件?
    • /tmp 是一个内存文件系统。卸载实例时内容消失。当一个函数运行时,它在一个实例上运行。在函数结束时,实例会继续运行,以防有新请求到来。如果不是,则在一段时间后实例被卸载。但是,如果您总是请求,则使用相同的实例并且需要清理 /tmp 目录以防止内存不足崩溃。这也意味着如果你有全局变量(比如 db connexion),你可以在请求之间重用它们,直到实例被卸载。
    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 2019-04-13
    • 2020-12-21
    • 2017-06-11
    • 1970-01-01
    • 2019-04-29
    • 2021-08-10
    • 2018-05-01
    相关资源
    最近更新 更多