【问题标题】:Download blob from gcp storage bucket with python flask使用 python flask 从 gcp 存储桶下载 blob
【发布时间】:2021-11-19 15:24:14
【问题描述】:

我有一个包含一些 pdf 文件的 GCP 存储桶。 我可以使用以下代码在本地主机上使用 python(flask) 从存储桶下载文件-

storage_client = storage.Client.from_service_account_json("ebillaae7f0224519.json")
bucket = storage_client.get_bucket("bill_storage1")
blob = bucket.blob(file_name)
blob.download_to_filename("file1.pdf")

但当部署在 GCP(应用程序引擎)上时,我收到此错误“第 1282 行,在 download_to_filename 中,open(filename, "wb") as file_obj: OSError: [Errno 30] Read-only file system: 'file1.pdf '" 然后我将代码修改为 -

storage_client = storage.Client.from_service_account_json("ebillaae7f0224519.json")
bucket = storage_client.get_bucket("bill_storage1")
blob = bucket.blob(file_name)
blob.download_to_filename("/tmp/file1.pdf")

这在部署后有效,但我无法通过我的应用程序将文件从存储桶下载到本地文件夹,该怎么做?

【问题讨论】:

  • 问题已更新

标签: python google-app-engine google-cloud-platform


【解决方案1】:

您不能在 Google App Engine 的文件系统部署后编写或修改。您只能在应用程序中读取文件。这就是为什么某些存储解决方案(例如 Cloud Storage 或任何数据库)是推荐的存储文件或数据的方式。

Google App Engine 是无服务器的。它可以快速扩展,因为它只是基于从源代码和预构建运行时构建的容器映像启动实例。在部署期间构建容器映像后,您将无法再编写/编辑其内容。您必须重新部署才能进行更改。

一个例外是名为/tmp 的目录,您可以在其中存储临时文件。这是因为该目录挂载在实例的 RAM 中。存储临时数据会消耗 RAM。因此,删除实例时,/tmp 目录下的文件也会被删除。

您可以查看此documentation 了解更多信息。

【讨论】:

    【解决方案2】:

    您可以根据自己的运行环境使用tempfile.gettempdir()函数获取tmp目录

    例如

    import tempfile
    
    storage_client = storage.Client.from_service_account_json("ebillaae7f0224519.json")
    bucket = storage_client.get_bucket("bill_storage1")
    blob = bucket.blob(file_name)
    blob.download_to_filename("{}/file1.pdf".format(tempfile.gettempdir()))
    
    

    在本地,文件将下载到您的操作系统默认临时目录中。

    【讨论】:

    • 嗨,谢谢,但文件格式不是 pdf,我希望将文件作为附件下载并在 api 调用中打开,知道吗?
    • 这不是您提出问题的目的。我只是拿了你的代码示例并解决了临时目录问题。无论如何,你能详细说明你想做什么吗?什么是“作为附件下载”和“在 API 调用时打开”?你说的是前端吗?后端?你想达到什么目标?
    猜你喜欢
    • 2021-07-25
    • 2022-11-10
    • 2021-09-21
    • 2022-08-02
    • 2019-02-17
    • 2020-02-23
    • 2020-10-05
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多