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中shape计算矩阵的方法示例
Apr 21 Python
Python 调用Java实例详解
Jun 02 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
Flask之请求钩子的实现
Dec 23 Python
python设定并获取socket超时时间的方法
Jan 12 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
Django 再谈一谈json序列化
Mar 16 Python
python中format函数如何使用
Jun 22 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 Python
利用python做数据拟合详情
Nov 17 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数据库操作面向对象的优点
2006/10/09 PHP
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
php微信开发之谷歌测距
2018/06/14 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
举例详解Python中yield生成器的用法
2015/08/05 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python3 max()函数基础用法
2019/02/19 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
python创建n行m列数组示例
2019/12/02 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
python实现简单飞行棋
2020/02/06 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
python实现二分查找算法
2020/09/18 Python
对孩子的寄语
2014/04/09 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android