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)
我是否需要为下载而不仅仅是上传实现分块?
我不建议使用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请求寻找同样的功能。我肯定有这样的东西存在,但似乎找不到。或者,如果我可以“列出”一个存