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端口扫描简单程序
Nov 10 Python
Django在win10下的安装并创建工程
Nov 20 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
详解python中*号的用法
Oct 21 Python
如何获取Python简单for循环索引
Nov 21 Python
py-charm延长试用期限实例
Dec 22 Python
logging level级别介绍
Feb 21 Python
Python hashlib和hmac模块使用方法解析
Dec 08 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 Squid中可缓存的动态网页设计
2008/09/17 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
php封装一个异常的处理类
2017/06/08 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
php语法检查的方法总结
2019/01/21 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
Python 描述符(Descriptor)入门
2016/11/20 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
Python如何将字符串转换为日期
2020/07/31 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
为什么会有内存对齐
2016/10/10 面试题
119消防日活动总结
2014/08/29 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书