首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >应用程序引擎从云存储下载的大小限制

应用程序引擎从云存储下载的大小限制
EN

Stack Overflow用户
提问于 2018-12-19 12:46:37
回答 1查看 1.3K关注 0票数 1

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

这只是下载的一个问题。上传工作到任何文件大小都很好,可以使用分块。

症状

我用AppEnginePython3.7标准环境创建了一个文件传输应用程序。用户可以上传任何大小的文件,这是很好的工作。但是,用户在从Cloud下载结果文件时遇到了似乎是一个大小限制。

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

Error: Server Error The server encountered an error and could not complete your request. Please try again in 30 seconds.

应用结构

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

为了测试应用程序,我访问了我创建的internal网页。我使用它将一个文件以块的形式上传到我的应用程序中,它成功地构成了云存储中的块。然后,我以管理员身份登录到Google平台控制台,当我查看Console时,它将显示我上传的55 me文件。它将允许我直接通过云平台控制台下载它,而且文件很好。

(直到这个过程的那个阶段,这甚至可以用于1.5G的文件。)

然后,我以非管理员用户的身份访问我的external网页。我使用该表单尝试接收与下载相同的文件。我知道上面的错误。但是,对于我的29 my测试文件,这整个过程没有遇到错误,或者更小。

此服务的Stacktrace日志显示:

logMessage: "The process handling this request unexpectedly died. This is likely to cause a new process to be used for the next request to your application. (Error code 203)"

可能的解决办法

我将以下行添加到我的external服务YAML文件中:

resources: memory_gb: 100 disk_size_gb: 100

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

也许我把Python误用在云存储上了。我从storage进口google.cloud。下面是我的应用程序通过向用户发送所请求的文件来响应用户的POST请求的地方:

代码语言:javascript
运行
AI代码解释
复制
@app.route('/download', methods=['POST'])
def provide_file():
    return external_download()

这一部分在external_download

代码语言:javascript
运行
AI代码解释
复制
    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)

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

EN

回答 1

Stack Overflow用户

发布于 2018-12-21 02:36:21

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

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

使用Cloud和Python有效地处理文件传输的经过验证的方法:

  • 直接使用云存储API的方法,不使用下载上传对象。正如@FridayPush所提到的,它将卸载您的应用程序,您可以使用签名URL控制访问。
  • 使用Blobstore存储API,一种简单、简单、简单的解决方案来处理文件传输,完全集成到GCS桶中,并适合于这种情况。
  • 使用内置Python请求模块,需要创建自己的处理程序来与GCS通信。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53858923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文