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中的面向对象编程详解(下)
Apr 13 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
python中threading超线程用法实例分析
May 16 Python
python遍历目录的方法小结
Apr 28 Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 Python
Python 获取div标签中的文字实例
Dec 20 Python
python自动发邮件总结及实例说明【推荐】
May 31 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
PyTorch如何搭建一个简单的网络
Aug 24 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+MSSQL分页的例子
2006/10/09 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
smarty自定义函数用法示例
2016/05/20 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
制作特殊字的脚本
2006/06/26 Javascript
js jquery做的图片连续滚动代码
2008/01/06 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
python保存文件方法小结
2018/07/27 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
解决python replace函数替换无效问题
2020/01/18 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
python实现网页录音效果
2020/10/26 Python
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
应用电子专业学生的自我评价
2013/10/16 职场文书
拉歌口号大全
2014/06/13 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
售房委托书
2014/08/30 职场文书
服务员岗位职责范本
2015/04/09 职场文书
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python