环境:谷歌 + python2.7 + django1.11.14 !!!话不多说,直接上代码
前端:
let download_mod_folder = document.getElementById("download_mod_folder");
download_mod_folder.addEventListener('click', function () {
if (Object.keys(mod_dict).length === 0) {
alert('暂无数据可下载')
}
else {
console.log('开始下载')
var $form = $("<form method='get'></form>");
$form.attr("action", "/knowledge/diff_test/send_zipfile/");
$(document.body).append($form);
//提交表单,实现下载
$form.submit();
}
})
后端:
import os
from django.http import StreamingHttpResponse
def send_zipfile(request):
# 判断下载文件是否存在
if not os.path.isfile(r'C:\Users\yongh\Desktop\mod_result.zip'):
return HttpResponse("Sorry but Not Found the File")
def file_iterator(file_path, chunk_size=512):
"""
文件生成器,防止文件过大,导致内存溢出
:param file_path: 文件绝对路径
:param chunk_size: 块大小
:return: 生成器
"""
with open(file_path, mode='rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
try:
# 设置响应头
# StreamingHttpResponse将文件内容进行流式传输,数据量大可以用这个方法(.pdf,.mp3,.mp4等等什么样格式的文件都可以下载)
response = StreamingHttpResponse(file_iterator(r'C:\Users\yongh\Desktop\mod_result.zip'))
# 以流的形式下载文件,这样可以实现任意格式的文件下载
response['Content-Type'] = 'application/octet-stream'
# Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
response['Content-Disposition'] = 'attachment;filename={file_name}{format}'.format(
file_name='my_zip', format=".zip")
except:
return HttpResponse("Sorry but Not Found the File")
# 在这里千万记得return,否则不会出现下载
return response
网友评论