Django基于客户端下载文件实现方法

 更新时间:2020年04月21日 11:58:24   作者:小陆同学  
这篇文章主要介绍了Django基于客户端下载文件实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

方法一: 使用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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Flask Web开发入门之文件上传(八)

    Flask Web开发入门之文件上传(八)

    这篇文章主要为大家详细介绍了Flask Web开发入门之文件上传的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Python中socket网络通信是干嘛的

    Python中socket网络通信是干嘛的

    在本篇文章里小编给大家分享的是关于Python中socket网络通信知识点内容,需要的朋友们可以跟着学习下。
    2020-05-05
  • Matplotlib中%matplotlib inline如何使用

    Matplotlib中%matplotlib inline如何使用

    这篇文章主要介绍了Matplotlib中%matplotlib inline如何使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python 字符串操作详情

    Python 字符串操作详情

    这篇文章主要介绍了Python 字符串操作,所谓字符串,就是由0个或者多个字符组成的有限序列,字符串的字符可以是特殊符号、英文字母、中文字符、日文的平假名或片假名、希腊字母、Emoji字符等等。下面我们大家一起来学习文章详细内容吧
    2021-11-11
  • python 按照sheet合并多个Excel的示例代码(多个sheet)

    python 按照sheet合并多个Excel的示例代码(多个sheet)

    这篇文章主要介绍了python 按照sheet合并多个Excel的示例代码(多个sheet),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python生成个性签名图片获取GUI过程解析

    Python生成个性签名图片获取GUI过程解析

    这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Python闭包技巧介绍

    Python闭包技巧介绍

    这篇文章主要介绍了Python闭包,所谓闭包就是用函数代替类,被外层函数包围的内层函数,它能够获取外层函数范围中的变量,感兴趣的小伙伴请和小编一起进入文章学习具体内容吧
    2021-12-12
  • 基于python+selenium的二次封装的实现

    基于python+selenium的二次封装的实现

    这篇文章主要介绍了基于python+selenium的二次封装的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Python cookbook(数据结构与算法)筛选及提取序列中元素的方法

    Python cookbook(数据结构与算法)筛选及提取序列中元素的方法

    这篇文章主要介绍了Python cookbook(数据结构与算法)筛选及提取序列中元素的方法,涉及Python列表推导式、生成器表达式及filter()函数相关使用技巧,需要的朋友可以参考下
    2018-03-03
  • 用Python写一个无界面的2048小游戏

    用Python写一个无界面的2048小游戏

    这篇文章主要介绍了用Python写一个无界面的2048小游戏的相关资料,需要的朋友可以参考下
    2016-05-05

最新评论