• django--完成客户端下载文件的三种方式


    方法一: 使用HttpResonse
    
     
    
    下面方法从url获取file_path, 打开文件,读取文件,然后通过HttpResponse方法输出。
    
    import os
    from django.http import HttpResponse
    
    def file_download(request, file_path):
        # do something...
        with open(file_path) as f:
            c = f.read()
        return HttpResponse(c)
    然而该方法有个问题,如果文件是个二进制文件,HttpResponse输出的将会是乱码。对于一些二进制文件(图片,pdf),我们更希望其直接作为附件下载。当文件下载到本机后,用户就可以用自己喜欢的程序(如Adobe)打开阅读文件了。这时我们可以对上述方法做出如下改进, 给response设置content_type和Content_Disposition。
    
    import os
    from django.http import HttpResponse, Http404
    
    
    def media_file_download(request, file_path):
        with open(file_path, 'rb') as f:
            try:
                response = HttpResponse(f)
                response['content_type'] = "application/octet-stream"
                response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
                return response
            except Exception:
                raise Http404
    HttpResponse有个很大的弊端,其工作原理是先读取文件,载入内存,然后再输出。如果下载文件很大,该方法会占用很多内存。对于下载大文件,Django更推荐StreamingHttpResponse和FileResponse方法,这两个方法将下载文件分批(Chunks)写入用户本地磁盘,先不将它们载入服务器内存。
    
     
    
    方法二: 使用SteamingHttpResonse
    
    import os
    from django.http import HttpResponse, Http404, StreamingHttpResponse
    
    def stream_http_download(request, file_path):
        try:
            response = StreamingHttpResponse(open(file_path, 'rb'))
            response['content_type'] = "application/octet-stream"
            response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
            return response
        except Exception:
            raise Http404
     
    
    方法三: 使用FileResonse
    
     
    
    FileResponse方法是SteamingHttpResponse的子类,是小编我推荐的文件下载方法。如果我们给file_response_download加上@login_required装饰器,那么我们就可以实现用户需要先登录才能下载某些文件的功能了。
    
    import os
    from django.http import HttpResponse, Http404, FileResponse
    
    
    def file_response_download1(request, file_path):
        try:
            response = FileResponse(open(file_path, 'rb'))
            response['content_type'] = "application/octet-stream"
            response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
            return response
        except Exception:
            raise Http404


    原文链接:https://blog.csdn.net/weixin_42134789/article/details/83346714

  • 相关阅读:
    数据结构-二叉树--二叉搜索树
    Django之Model操作
    Django之Form组件
    Django之url(路由)配置
    Django框架之模板继承和静态文件配置
    Django框架之第三篇模板语法(重要!!!)
    Django ORM操作及进阶
    django 之 ORM操作多表联查总结
    人生苦短,我学python之python xml数据解析
    人生苦短,我学python之python re正则表达式
  • 原文地址:https://www.cnblogs.com/lutt/p/12723283.html
Copyright © 2020-2023  润新知