Django基于客户端下载文件实现方法


Posted in Python onApril 21, 2020

方法一: 使用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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
如何高效使用Python字典的方法详解
Aug 31 Python
简述Python2与Python3的不同点
Jan 21 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
Python实现的栈、队列、文件目录遍历操作示例
May 06 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
Pytorch 统计模型参数量的操作 param.numel()
May 13 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 #Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 #Python
jupyter notebook 的工作空间设置操作
Apr 20 #Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 #Python
Python yield生成器和return对比代码实例
Apr 20 #Python
jupyter notebook tensorflow打印device信息实例
Apr 20 #Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 #Python
You might like
Apache中php.ini的设置方法
2013/02/28 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
javascript常用的方法整理
2015/08/20 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
react基本安装与测试示例
2020/04/27 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
python远程连接MySQL数据库
2019/04/19 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python爬虫 正则表达式解析
2019/09/28 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
新店开张活动方案
2014/08/24 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
2015年药店工作总结
2015/04/20 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书