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中操作字符串之rstrip()方法的使用
May 19 Python
Python批量更改文件名的实现方法
Oct 29 Python
python图像常规操作
Nov 11 Python
Python内建模块struct实例详解
Feb 02 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
详解python里的命名规范
Jul 16 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 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循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
python中List的sort方法指南
2014/09/01 Python
python实现堆栈与队列的方法
2015/01/15 Python
详解python中@的用法
2019/03/27 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
大学生考试作弊被抓检讨书
2014/12/27 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
python实现进度条的多种实现
2021/04/29 Python
如何使用vue3打造一个物料库
2021/05/08 Vue.js