flask实现下载文件、前后端

采用前后端分离的过程中,前端只能下载静态文件中的文件或者url下载文件。但是,一般情况下文件要么是远程或者存在于其他文件夹。这种情况就需要采用后端预先下载文件,传递给前端。

flask有几种文件传输方式,比如send_file、send_file_dictionary或者下面这种方式。这几种方式返回的数据不能被二次格式化,只能原样返回。

flask后台

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);

你可能感兴趣的:(nodejs,Python)