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中__name__的使用实例
Apr 14 Python
python实现比较两段文本不同之处的方法
May 30 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
详解python中asyncio模块
Mar 03 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
python实现门限回归方式
Feb 29 Python
Python函数默认参数常见问题及解决方案
Mar 26 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下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python易忽视知识点小结
2015/05/25 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python实现TF-IDF算法解析
2018/01/02 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
总裁秘书岗位职责
2013/12/04 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
工程材料采购方案
2014/05/18 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
初一数学教学反思
2016/02/17 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技