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 相关文章推荐
django接入新浪微博OAuth的方法
Jun 29 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
Dec 09 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 Python
python实现zabbix发送短信脚本
Sep 17 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
Python将文字转成语音并读出来的实例详解
Jul 15 Python
python3.7 的新特性详解
Jul 25 Python
Django用户认证系统 组与权限解析
Aug 02 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 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
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
轮播图组件js代码
2016/08/08 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
Django权限机制实现代码详解
2018/02/05 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
python中如何打包用户自定义模块
2020/09/23 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
女方婚礼新郎答谢词
2014/01/11 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
文明城市创建标语
2014/06/16 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
医院标语大全
2014/06/23 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
springboot入门 之profile设置方式
2022/04/04 Java/Android