【问题标题】:How to download large file from Cloud Run in Django如何在 Django 中从 Cloud Run 下载大文件
【发布时间】:2021-07-28 13:45:24
【问题描述】:

我在 Cloud Run 上有 Django 项目。当我从具有以下代码的页面下载小文件时。

def download_view(request,pk):
    file_path = f'media/{pk}.mp3'
    name = f'{pk}.mp3'
    with open(file_path, 'rb') as f:
        response = HttpResponse(f.read(), content_type='audio/wav')
    response['Content-Disposition'] = f'attachment; filename={name}'
    return response

它工作正常。但是,当我下载一个文件(50MB)时。我得到了这张图片的错误。

Cloud run 的日志是这样的。我找不到任何回溯日志。

2021-05-06 12:00:35.668 JSTGET500606 B66 msChrome 72 https://***/download/mp3/2500762/
2021-05-06 11:49:49.037 JSTGET500606 B61 msChrome 72 https://***/download/mp3/2500645/

我不确定。这个错误是否与下载错误有关。

2021-05-06 16:48:32.570 JSTResponse size was too large. Please consider reducing response size.

我认为这是上传文件大小错误。所以这与下载错误的主题无关。

当我在本地运行 Django 时,然后下载相同的 50MB 文件。我可以下载它。我认为这个下载错误与云运行有关。它在请求/响应后停止。所以我认为这个错误是由 Cloud Run 引起的。当我仍在下载文件时,它已停止。

我不知道如何解决这个下载错误。如果您有任何解决方案,请帮助我!

【问题讨论】:

    标签: python django google-cloud-run


    【解决方案1】:

    Cloud Run HTTP 请求/响应大小为limited to 32Mb。使用multipart/form-data 发送大文件的块,而不是直接发送整个文件。

    【讨论】:

      【解决方案2】:

      谢谢@guillaume blaquiere!我解决了下载错误。我为其他人发布我的代码。

      def _file_iterator(file, chunk_size=512):
          with open(file, 'rb') as f:
              while True:
                  c = f.read(chunk_size)
                  if c:
                      yield c
                  else:
                      break
      
      def download_view(request,pk):
          file_path = f'media/{pk}.mp3'
          file_name = f'{pk}.mp3'
          response = StreamingHttpResponse(_file_iterator(file_path))
          response['Content-Type'] = 'audio/mpeg'
          response['Content-Disposition'] = f'attachment;filename="{file_name}"'
          return response
      

      我认为 StreamingHttpResponse 是这个问题的关键。它按块返回大文件。它不会超过 Cloud Run 的限制。

      当我使用 multipart/form-data 作为 Content-Type 时,我可以下载文件。但它无法在智能手机上打开,因为它无法选择应用程序。当我在PC上下载时,它无法显示音频文件图标。我们应该选择确切的内容类型。

      【讨论】:

      • 你可以尝试设置“transfer-encoding: chunked”
      猜你喜欢
      • 2021-05-04
      • 2020-12-16
      • 1970-01-01
      • 2019-06-21
      • 2013-08-19
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      相关资源
      最近更新 更多