如何在 Django 中从 Cloud 运行 下载大文件

How to download large file from Cloud Run in Django

我在云上有 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)时。我得到这张照片的错误。

云运行的日志是这样的。我找不到任何回溯日志。

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 运行 有关。 request/response 后停止。所以我认为这个错误是由 Cloud 运行 引起的。当我还在下载文件时,它已停止。

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

云 运行 HTTP request/response 大小为 limited to 32Mb。使用 multipart/form-data 发送大文件的块而不是直接发送整个文件。

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

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 是这个问题的关键点。这是 return 个大文件。它没有超过 Cloud 运行 的限制。

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