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实现计算资源图标crc值的方法
Oct 05 Python
python编写Logistic逻辑回归
Dec 30 Python
基于Python实现的微信好友数据分析
Feb 26 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
Python比较配置文件的方法实例详解
Jun 06 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 Python
用Python selenium实现淘宝抢单机器人
Jun 18 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
php无限级分类实现方法分析
2016/10/19 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
javascript操作JSON的要领总结
2012/12/09 Javascript
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Python中用于计算对数的log()方法
2015/05/15 Python
python中zip和unzip数据的方法
2015/05/27 Python
Django卸载之后重新安装的方法
2017/03/15 Python
Python面向对象类的继承实例详解
2018/06/27 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python各类经纬度转换的实例代码
2019/08/08 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
Python ATM功能实现代码实例
2020/03/19 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
python进度条显示之tqmd模块
2020/08/22 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
巴西网上药房:onofre
2016/11/21 全球购物
什么是URL
2015/12/13 面试题
电脑教师的教学自我评价
2013/11/26 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
红色影片观后感
2015/06/18 职场文书
趣味运动会赞词
2015/07/22 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis
python使用BeautifulSoup 解析HTML
2022/04/24 Python