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中Collection的使用小技巧
Aug 18 Python
Python实现二叉堆
Feb 03 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python实现两款计算器功能示例
Dec 19 Python
python3实现随机数
Jun 25 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python随机函数库random的使用方法详解
Aug 21 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
python中Matplotlib绘制直线的实例代码
Jul 04 Python
python装饰器代码解析
Mar 23 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
珊瑚虫IP库浅析
2007/02/15 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
复制本贴标题和地址的js代码
2008/07/01 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Vue实现验证码功能
2019/12/03 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
python网络编程实例简析
2014/09/26 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
pywinauto自动化操作记事本
2019/08/26 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
二手房买卖协议书
2014/04/10 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
网络营销计划书
2015/01/17 职场文书
大雁塔导游词
2015/02/04 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
推普标语口号大全
2015/12/26 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
python之基数排序的实现
2021/07/26 Python