采用前后端分离的过程中,前端只能下载静态文件中的文件或者url下载文件。但是,一般情况下文件要么是远程或者存在于其他文件夹。这种情况就需要采用后端预先下载文件,传递给前端。
flask有几种文件传输方式,比如send_file、send_file_dictionary或者下面这种方式。这几种方式返回的数据不能被二次格式化,只能原样返回。
link 是文件路径或者链接
temp_path是下载的文件临时路径
urllib.urlretrieve(
link,temp_path, urlcallback)
# # content = send_file(temp_path , as_attachment=True)
# return True, make_response(send_from_directory(base_path, tool_name, as_attachment=True))
raw_bytes = ""
with open(temp_path, 'rb') as r:
for line in r:
raw_bytes = raw_bytes + line
response = make_response(raw_bytes)
response.headers['Content-Type'] = "application/octet-stream"
response.headers['Content-Disposition'] = "inline; filename=" + tool_name
print response
def urlcallback(a, b, c):
"""
call back function
a,已下载的数据块
b,数据块的大小
c,远程文件的大小
"""
prec = 100.0 * a * b / c
if 100 < prec:
prec = 100
cls.g_logger.info("%.2f%%" % (prec,))
let content = response.request.response;
let name = row.tool_name;
let url = window.URL.createObjectURL(new Blob([content])); //处理文档流
console.log(url);
// let fileTye = url.match(/.+\/(.+)$/)[1];
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.download = name;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);