如何在 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 准确的内容类型。
我在云上有 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 准确的内容类型。