背景
开发的时候使用了一个基于tornado的魔改的框架,后端返回的数据只有json字符串一种形式,为了简单的实现文件下载,找到了一种在后端将文件二进制读取后进行base64编码然后通过字符串返回,在前端恢复未Blob对象之后再下载文件的方法。
这个方法不是很可取,在前端点击按钮发送下载请求之后,收到字符串恢复文件再下载耗费的时间比较长,而且超过100M大小的文件就会出问题。
后端代码
- 压缩并切分文件:
def compress_file(self, base_path, files):
os.mkdir(base_path + 'download')
for file in files:
shutil.move(base_path + file , base_path + 'download')
os.system('tar -czvf ' + base_path + 'download.tar.gz ' + base_path + 'download/')
os.system('split -b 50m ' + base_path + 'download.tar.gz ' + base_path + 'download.tar.gz.')
- 读取文件列表,一次任务的文件被放入一个随机id的目录下:
def load_documents(self, file_uuid):
base_path = './tempfile/' + file_uuid
file_list = []
all_files = os.listdir(base_path)
for item in all_files:
if '.tar.gz.' in item:
file_list.append(item)
return file_list
- 返回base64编码文件:
def download(self, task_uuid, name):
# 文件生成之后返回base64编码字符串
file_name = './tempfile/' + task_uuid + '/' + name
with open(file_name, 'rb') as f:
bs64_str = str(base64.b64encode(f.read()))
print(type(bs64_str))
return bs64_str
这里的bs64就是返回给前端的编码后的文件。
前端
iboot是项目使用的前端框架,ibootClint可以看作封装好的发送http请求的接口。
- ibootClient(框架代码供参考)
import {
Injectable } from '@angular/core';
import {
HttpClient,