【Django】实现文件下载

一、思想

  • 前端:a标签+静态文件
<a href="{% url 'down' %}">下载</a>
  • 后端:响应头(django实现文件下载,下文均为django views端实现)

二、使用FileResponse

2.1 代码实例

from django.http import FileResponse

def file_down(request):  
    file = open(os.path.abspath(os.path.dirname(os.path.dirname(__file__)))+ '/history/vulnscan/vulnscan.pdf', 'rb')  # 下载当前目录的上一级目录下的history/vulnscan目录下的vulnscan.pdf文件
    response =FileResponse(file)  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="example.tar.gz"'  
    return response 

假设我当前项目主目录:
在这里插入图片描述
我需下载的文件在:
在这里插入图片描述
python获取当前工作目录:

p1 = os.path.abspath(os.path.dirname(__file__))  # 获取当前目录

p2 = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))  # 获取上级目录

执行下载:
在这里插入图片描述

2.2 结合之前

结合我之前文章 python调AWVS接口 新建扫描并导出扫描报告,将下载扫描报告的功能重写到django的views视图中,使用FileResponse方法实现“真正的下载”。

思想:
1、下载入口,当点击html按钮时,触发一系列活动;
在这里插入图片描述

2、下载的响应来到后端,服务器先请求AWVS api,再次请求返回的报告地址;

rr = requests.get(url=down_url,headers=self.auth_headers,verify=False)

3、将返回的报告内容写入空文件,生成服务端的报告。每次下载时对旧报告进行覆盖;

path = './history/vulnscan/'
if not os.path.exists(path):  # 判断当前路径是否存在,没有则创建new文件夹
       os.makedirs(path)
       txt = open(path + 'vulnscan.html', 'wb')
       txt.write(rr.content)   # 写入文件
       txt.close()

4、这时服务端总存一份新报告,通过Django再次请求刚写入的本地文件,利Django的FileResponse方法将文件形成流数据,并将响应信息返回给前端,实现下载;

5、验证,可得客户端下载成功。
在这里插入图片描述

三、使用HttpResponse

from django.shortcuts import HttpResponse  
def file_down(request):  
    file=open('/home/amarsoft/download/example.tar.gz','rb')  
    response =HttpResponse(file)  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="example.tar.gz"'  
    return response

四、使用StreamingHttpResponse

from django.http import StreamingHttpResponse  
def file_down(request):  
    file=open('/home/amarsoft/download/example.tar.gz','rb')  
    response =StreamingHttpResponse(file)  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="example.tar.gz"'  
    return response  

五、Reference

Django 如何实现文件下载: https://www.cnblogs.com/supery007/p/8146035.html

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微雨停了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值