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.
应用结构
为了创建我的文件传输应用程序,我使用了internal
和external
两个服务,每个服务都有自己的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请求的地方:
@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)
我是否需要为下载实现分块,而不仅仅是上传?
发布于 2018-12-21 02:36:21
我不建议使用方法来管理大型文件传输,Flask文件处理方法是开发人员或API使用的,主要用于交换系统消息,比如日志、cookie和其他轻量级对象。
此外,download_as_string()
方法可能确实隐藏了缓冲区限制,我确实复制了您的场景,并得到了与大于30‘t的文件相同的错误消息,但是我找不到更多关于此类约束的信息。它可能是有意的,是由方法的目的引起的(下载内容作为字符串,不适合大型对象)。
使用Cloud和Python有效地处理文件传输的经过验证的方法:
https://stackoverflow.com/questions/53858923
复制相似问题