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写的windows服务不能启动的问题
Apr 15 Python
Python字典操作简明总结
Apr 13 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
Django后台admin的使用详解
Jul 08 Python
python版百度语音识别功能
Jul 09 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
numpy 返回函数的上三角矩阵实例
Nov 25 Python
python定义类的简单用法
Jul 24 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
Python Socket使用实例
2017/12/18 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
浅析python协程相关概念
2018/01/20 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
python实现tail -f 功能
2020/01/17 Python
Python短信轰炸的代码
2020/03/25 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
数控专业推荐信范文
2013/12/02 职场文书
交通事故协议书范文
2014/04/16 职场文书
驾驶员培训方案
2014/05/01 职场文书
参观邀请函范文
2015/02/02 职场文书
七一慰问简报
2015/07/20 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis