zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/lutt/p/12723283.html
Copyright © 2011-2022 走看看