Django基于客户端下载文件实现方法
方法一:使用HttpResonse
下面方法从url获取file_path,打开文件,读取文件,然后通过HttpResponse方法输出。
importos fromdjango.httpimportHttpResponse deffile_download(request,file_path): #dosomething... withopen(file_path)asf: c=f.read() returnHttpResponse(c)
然而该方法有个问题,如果文件是个二进制文件,HttpResponse输出的将会是乱码。对于一些二进制文件(图片,pdf),我们更希望其直接作为附件下载。当文件下载到本机后,用户就可以用自己喜欢的程序(如Adobe)打开阅读文件了。这时我们可以对上述方法做出如下改进,给response设置content_type和Content_Disposition。
importos fromdjango.httpimportHttpResponse,Http404 defmedia_file_download(request,file_path): withopen(file_path,'rb')asf: try: response=HttpResponse(f) response['content_type']="application/octet-stream" response['Content-Disposition']='attachment;filename='+os.path.basename(file_path) returnresponse exceptException: raiseHttp404
HttpResponse有个很大的弊端,其工作原理是先读取文件,载入内存,然后再输出。如果下载文件很大,该方法会占用很多内存。对于下载大文件,Django更推荐StreamingHttpResponse和FileResponse方法,这两个方法将下载文件分批(Chunks)写入用户本地磁盘,先不将它们载入服务器内存。
方法二:使用SteamingHttpResonse
importos fromdjango.httpimportHttpResponse,Http404,StreamingHttpResponse defstream_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) returnresponse exceptException: raiseHttp404
方法三:使用FileResonse
FileResponse方法是SteamingHttpResponse的子类,是小编我推荐的文件下载方法。如果我们给file_response_download加上@login_required装饰器,那么我们就可以实现用户需要先登录才能下载某些文件的功能了。
importos fromdjango.httpimportHttpResponse,Http404,FileResponse deffile_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) returnresponse exceptException: raiseHttp404
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。