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 dict remove数组删除(del,pop)
Mar 24 Python
python实现TCP服务器端与客户端的方法详解
Apr 30 Python
python实现备份目录的方法
Aug 03 Python
Unicode和Python的中文处理
Mar 19 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 Python
python实现Nao机器人的单目测距
Sep 04 Python
python入门学习关于for else的特殊特性讲解
Nov 20 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数组循环操作详细介绍 附实例代码
2013/02/03 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python爬取读者并制作成PDF
2015/03/10 Python
python自动格式化json文件的方法
2015/03/11 Python
django批量导入xml数据
2016/10/16 Python
5款非常棒的Python工具
2018/01/05 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
python实现图片压缩代码实例
2019/08/12 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
Python创建临时文件和文件夹
2020/08/05 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
印度在线杂货店:bigbasket
2018/08/23 全球购物
平民服装店创业计划书
2014/01/17 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书