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实现排序算法
Feb 14 Python
python处理PHP数组文本文件实例
Sep 18 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
使用python实现生成用户信息
Mar 20 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
python切片及sys.argv[]用法详解
May 25 Python
Python装饰器的执行过程实例分析
Jun 04 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
在python3中实现更新界面
Feb 21 Python
python如何写出表白程序
Jun 01 Python
Python装饰器如何实现修复过程解析
Sep 05 Python
Anaconda配置各版本Pytorch的实现
Aug 07 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和ACCESS写聊天室(二)
2006/10/09 PHP
如何使用php实现评委评分器
2015/07/31 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
jQuery获取table行数并输出单元格内容的实现方法
2016/06/30 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Python操作列表之List.insert()方法的使用
2015/05/20 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python