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 将字符串转换成字典dict
Mar 24 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
Python中文竖排显示的方法
Jul 28 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
机器学习的框架偏向于Python的13个原因
Dec 07 Python
python正则中最短匹配实现代码
Jan 16 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
Python猴子补丁知识点总结
Jan 05 Python
python数据爬下来保存的位置
Feb 17 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 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
收集的php编写大型网站问题集
2007/03/06 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
简单实现php上传文件功能
2017/09/21 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
三种取消选中单选框radio的方法
2014/09/09 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
python通过post提交数据的方法
2015/05/06 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
机械设计及其自动化专业推荐信
2013/10/31 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
学校就业推荐信范文
2014/05/19 职场文书
媒体宣传策划方案
2014/05/25 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS