码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-17 23:40:56      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:读取   weixin   url   大文件   读取文件   div   require   通过   download   

方法一: 使用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--完成客户端下载文件的三种方式

标签:读取   weixin   url   大文件   读取文件   div   require   通过   download   

原文地址:https://www.cnblogs.com/lutt/p/12723283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!