Django下载文件的三种方法

在Django中,你可以使用以下三种方法来下载文件:

  1. 使用 FileResponse

    python复制代码
    from django.http import FileResponse
    
    def download_file(request):
        file_path = '/path/to/file.txt'  # 文件路径
        file = open(file_path, 'rb')  # 打开文件
        response = FileResponse(file)  # 创建FileResponse对象
        return response
  2. 使用 HttpResponseFileWrapper

    python复制代码
    from django.http import HttpResponse
    from wsgiref.util import FileWrapper
    import os
    
    def download_file(request):
        file_path = '/path/to/file.txt'  # 文件路径
        file = open(file_path, 'rb')  # 打开文件
        file_name = os.path.basename(file_path)  # 获取文件名
        response = HttpResponse(FileWrapper(file), content_type='application/octet-stream')
        response['Content-Disposition'] = 'attachment; filename="{}"'.format(file_name)
        return response
  3. 使用 StreamingHttpResponse

    python复制代码
    from django.http import StreamingHttpResponse
    import os
    
    def download_file(request):
        file_path = '/path/to/file.txt'  # 文件路径
        file_name = os.path.basename(file_path)  # 获取文件名
    
        def file_iterator(file_path):
            with open(file_path, 'rb') as f:
                while True:
                    chunk = f.read(1024)
                    if not chunk:
                        break
                    yield chunk
    
        response = StreamingHttpResponse(file_iterator(file_path), content_type='application/octet-stream')
        response['Content-Disposition'] = 'attachment; filename="{}"'.format(file_name)
        return response

对于大文件下载,由于大文件可能会占用较大的内存,你可以使用第三种方法中的 StreamingHttpResponse 来实现分块下载。通过生成器函数逐块读取文件内容并以流式方式传输给客户端,可以避免一次性加载整个文件到内存中。

请注意,在这些示例代码中,file_path 是文件的完整路径,你需要将其替换为你要下载的实际文件的路径。

另外,对于大型文件,还可以考虑使用第三方库(例如:django-sendfile、django-downloadview等)来优化文件下载的性能和可靠性。这些库提供了更高级的功能和配置选项,以应对大规模的文件下载需求。

posted @ 2023-07-14 16:31  Python喵  阅读(2986)  评论(0编辑  收藏  举报