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 算法 排序实现快速排序
Jun 05 Python
用Python的线程来解决生产者消费问题的示例
Apr 02 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
在Python中使用判断语句和循环的教程
Apr 25 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
快速了解Python中的装饰器
Jan 11 Python
使用Flask集成bootstrap的方法
Jul 24 Python
基于DataFrame改变列类型的方法
Jul 25 Python
python中类的属性和方法介绍
Nov 27 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
Python控制台实现交互式环境执行
Jun 09 Python
用python制作个音乐下载器
Jan 30 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提示undefined index的几种解决方法
2012/05/21 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
python直接访问私有属性的简单方法
2016/07/25 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python 日志增量抓取实现方法
2018/04/28 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
上课迟到检讨书100字
2014/01/11 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
2016年会开场白台词
2015/06/01 职场文书
golang正则之命名分组方式
2021/04/25 Golang
为什么node.js不适合大型项目
2021/04/28 Javascript