当前位置: 首页 > 知识库问答 >
问题:

使用App Engine从云存储下载的大小限制

苏涛
2023-03-14

tldr:从云存储将文件作为下载发送到用户的web浏览器是否有文件大小限制?我使用的存储Python API是错误的,还是需要增加应用程序引擎YAML文件设置的资源?

这只是下载的问题。使用分块,上传到任何大小的文件都非常有效。

我用App Engine Python 3.7标准环境创建了一个文件传输应用程序。用户可以上传任何大小的文件,而且运行良好。但是用户在从云存储下载结果文件时遇到了大小限制。

我在整个上传/下载过程中成功发送和接收的最大文件是29兆字节。然后我给自己发送了一个55兆字节的文件,但当我试图以下载的形式接收它时,Flask给了我以下错误:

错误:服务器错误服务器遇到错误,无法完成您的请求。请在30秒内重试。

为了创建我的文件传输应用程序,我使用Flask设置了两个服务,内部外部,每个服务都有自己的Flask路由文件、自己的网页/域和自己的YAML文件。

为了测试应用程序,我访问了我创建的内部网页。我使用它将文件块上传到我的应用程序,它成功地在云存储中组成块。然后,我以管理员身份登录谷歌云平台控制台,当我查看云存储时,它会显示我上传的55兆字节文件。它会让我直接通过云平台控制台下载,文件不错。

(到目前为止,这甚至适用于1.5GB的文件。)

然后我以非管理员用户的身份进入我的外部网页。我使用该表单尝试接收与下载相同的文件。我得到上面的错误。然而,对于我的29兆字节测试文件或更小的文件,整个过程没有遇到错误。

此服务的Stacktrace调试器日志显示:

logMessage:“处理此请求的进程意外死亡。这可能会导致新进程用于应用程序的下一个请求。(错误代码203)

我在我的外部服务YAML文件中添加了以下行:

资源:内存\u gb:100磁盘大小\u gb:100

错误保持不变。显然这不是系统资源的限制?

也许我误用了云存储的Python API。我正在导入存储google.cloud。下面是我的应用程序通过向用户发送他们请求的文件来响应用户的POST请求的地方:

@app.route('/download', methods=['POST'])
def provide_file():
    return external_download()

这部分在external_download中:

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(current_app.cloud_storage_bucket)
    bucket_filename = request.form['filename']
    blob = bucket.blob(bucket_filename)

    return send_file(io.BytesIO(blob.download_as_string()),
                     mimetype="application/octet-stream",
                     as_attachment=True,
                     attachment_filename=filename)

我是否需要为下载而不仅仅是上传实现分块?


共有1个答案

薛墨一
2023-03-14

我不建议使用Flask的send_file()方法来管理大文件传输,Flask文件处理方法主要供开发人员或API使用,以交换系统消息,如日志、cookie和其他轻对象。

此外,download_as_string()方法可能确实隐藏了缓冲区限制,我确实重现了您的场景,并在文件大于30mb的情况下得到了相同的错误消息,但是我找不到关于这种约束的更多信息。它可能是有意的,由方法的目的引起(下载内容为字符串,不适合大型对象)。

通过云存储和Python高效处理文件传输的成熟方法:

>

使用BlobstoreAPI,这是一个简单、轻量级的解决方案,用于处理文件传输,与GCS bucket完全集成,适用于这种情况。

使用内置的Python请求模块,需要创建自己的处理程序来与GCS通信。

 类似资料:
  • 我在尝试从谷歌云存储下载CSV文件时遇到了一个问题。出于某种原因,它一直以字节而不是可读文本的形式下载文件。当我在Excel中打开下载的CSV时,Excel已经足够智能,可以将其转换为可读文本。我在这里错过了什么?我检查了谷歌的文档,但找不到任何好的信息来完成它们。提前谢谢你! 这是错误:UnicodeDecodeError:“utf-8”编解码器无法解码位置15-16的字节:无效的连续字节

  • 最近我一直在使用GitHub,我想知道,GitHub上托管的文件的存储库限制是多少。通用域名格式?我一直想知道这一点,因为我考虑使用GitLab,因为它允许每个存储库使用10GB。

  • 我有一个谷歌云存储桶,我可以使用python中的函数下载对象,我也可以使用或函数下载整个目录。 有没有一种方法可以使用python作为单个zip文件从存储桶下载整个目录。 这样做Python——从谷歌云存储下载整个目录需要我逐个文件下载。 有没有办法一次下载整个目录?

  • 我需要从我的谷歌云存储从我的桶中下载NodeJS文件夹。我读了所有的留档,我只找到了下载文件而不是文件夹的方法。我需要获取/下载文件夹以提供用户的下载文件。 有人能帮我吗?

  • 我有一个处理CSV文件并返回一些分析的应用程序。我的用户将文件存储在GCP云存储桶中,我希望他们能够向我传递一个存储桶URL和一些身份验证令牌/签名URL,然后应用程序将下载文件并根据需要解析它们。 阅读GCP留档时,我遇到了以下gsutil命令: 这正是我所需要的,但是我正在通过一些REST API HTTP请求寻找同样的功能。我肯定有这样的东西存在,但似乎找不到。或者,如果我可以“列出”一个存