1. 思路:
文件,让用户下载 - a标签+静态文件 - 设置响应头(django如何实现文件下载)
2. a标签实现
<a href="/static/xxx.xlsx">下载模板</a>
3. 设置响应头
方法一:使用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
方法三:使用FileResponse
from django.http import FileResponse def file_down(request): file=open(\'/home/amarsoft/download/example.tar.gz\',\'rb\') response =FileResponse(file) response[\'Content-Type\']=\'application/octet-stream\' response[\'Content-Disposition\']=\'attachment;filename="example.tar.gz"\' return response
总结:对比
虽然使用这三种方式都能实现,但是推荐用FileResponse,在FileResponse中使用了缓存,更加节省资源。虽说是三种方式,但是原理相同,说白了就是一种方式。为了更好的实现文件下载,
FileResponse对StreamingHttpResponse做了进一步的封装,即StreamingHttpResponse是FileResponse的父类。而HttpResponse,StreamingHttpResponse,
FileResponse三者都继承了基类HttpResponseBase。HttpResponseBase类是一个字典类,其封装了一个_headers属性,该属性是一个字典类型,里面封装了response的头信息。
因为该HttpResponseBase类被封装成了一个字典类,所以可以直接使用response[\'Content-Type\']这种形式访问,也可以使用response._headers[\'Content-Type\']访问。值得注意的是: 1.HttpResponseBase只有来设置response的头信息,并不能返回给客户端发生数据。 2.response.keys()这中形式不能访问到字典的方法,必须使用response._headers.keys()才能访问到字典的方法。
4. 项目案例:
1.让公司内部可以批量导入客户资源信息;
2. 首先要下载xlsx模板文件;
增加URL:
urlpatterns = [ url(r\'^stark/crm/login/\', crm_views.login,name=\'crm_login\'), url(r\'^stark/crm/index/\', crm_views.index,name=\'crm_index\'), url(r\'^stark/crm/Download/\', crm_views.download,name=\'crm_download\'),
]
编写download视图函数:
def download(request):
file=open(\'static/xlsx/xlsx_file.xlsx\',\'rb\')
response =FileResponse(file)
response[\'Content-Type\']=\'application/octet-stream\'
response[\'Content-Disposition\']=\'attachment;filename="xlsx_file.xlsx"\'
return response
前端页面反向解析URL
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>批量导入客户数据</title> </head> <body> <h2>批量导入</h2> <form action=""> <a href="{% url \'crm_download\' %}">下载模板</a> <p><input type="file" name="xsfile"></p> <p><input type="submit" value="提交"></p> </form> </body> </html>