ajax post下载flask文件流以及中文文件名问题
ajax post下载文件
后端返回文件流,flask中可使用 return send_file
(文件路径) 返回二进制文件流,在headers中传送文件相关信息(如文件名)。
前端使用 URL.createObjectURL() 创建创建一个 DOMString URL对象,创建一个 a 节点,将URL对象赋给a节点的 href 属性,最后调用 click() 方法点击该 a 节点即可弹出浏览器下载框。
展示图片
方法同上,将 a 改成 img , href 改成 src 即可,将URL对象写入到目标img标签的src即可。
另一种方法是后端返回图片转base64的字符串,src的值形如 "data:image/svg+xml;base64,${base字符串}"
。(这里的 svg+xml 表示图片格式是svg,如果是png则改成png)
中文文件名乱码
http headers中直接传输中文文件名,比较简单的方法是后端进行url转码(这里使用python的 urllib.parse.quote ),前端使用 decodeURI()
解码。
此外还可以设置headers的 Content-Disposition: attachment; filename*=UTF-8''xxxxx
,不过兼容性嘛……麻烦还不如直接urlcode算了,而且也懒得设置 Content-Disposition 了,前端从 Content-Disposition
中取 filename 也是够麻烦的,会取到一长串字符串然后自己再想办法取出来 filename= 后面的信息。
代码如下:
flask
from urllib.parse import quote @file.route('/download', methods=["POST"]) def download_file(): filename='xx' #文件名 filepath='xx/xx' #文件路径 res = make_response(send_file(filepath)) #自定义的一个header,方便前端取到名字 res.headers['filename'] = quote(filename.encode('utf-8')) return res javascript――以async异步fetch为例: async function download() { const res = await fetch(`http://xxx/file/download`, { method: "POST", body: JSON.stringify({}), //body里面是要发送的数据 headers: { "Content-Type": "application/json" }, responseType: 'blob' }) if (res.ok) { const blData = await res.blob() //拿到blob数据 const urlObjData = window.URL.createObjectURL(new Blob([blData])) //创建url对象 //获取文件 进行下转码 const fileName = decodeURI(fileNameres.headers.get('filename')) //创建a标签 点击a标签 达到下载目的 const link = document.createElement('a') link.href = urlObjData link.download = fileName //下载文件的名字 document.body.appendChild(link) link.click() document.body.removeChild(link) window.URL.revokeObjectURL(urlObjData); //展示图片 //xxx.src=urlObjData } }
ps:flask下载文件---文件流
html:
<a name="downloadbtn" class="btn btn-success pull-right" href="/downloadfile/?filename=/root/allfile/123.txt">下载</a>
py:
@app.route('/downloadfile/', methods=['GET', 'POST']) def downloadfile(): if request.method == 'GET': fullfilename = request.args.get('filename') # fullfilename = '/root/allfile/123.txt' fullfilenamelist = fullfilename.split('/') filename = fullfilenamelist[-1] filepath = fullfilename.replace('/%s'%filename, '') #普通下载 # response = make_response(send_from_directory(filepath, filename, as_attachment=True)) # response.headers["Content-Disposition"] = "attachment; filename={}".format(filepath.encode().decode('latin-1')) #return send_from_directory(filepath, filename, as_attachment=True) #流式读取 def send_file(): store_path = fullfilename with open(store_path, 'rb') as targetfile: while 1: data = targetfile.read(20 * 1024 * 1024) # 每次读取20M if not data: break yield data response = Response(send_file(), content_type='application/octet-stream') response.headers["Content-disposition"] = 'attachment; filename=%s' % filename # 如果不加上这行代码,导致下图的问题 return response
没有文件名,和文件格式,遇到这种情况,打开F12,查看response.headers 与正常的比较
总结
到此这篇关于ajax post下载flask文件流以及中文文件名的文章就介绍到这了,更多相关ajax post下载flask文件流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- Ruby on Rails实现文件的下载以及中文文件名乱码问题
- 万恶的中文乱码问题ajax提交、单个文件下载(文件名)和打包下载压缩包中文件文件名乱码...
- ajax请求服务器数据包含中文处理以及MVC中下载文件名在ie和firefox中的处理
- Response.AddHeader实现下载_解决下载界面中文文件名乱码问题
- springboot解决下载文件,文件名中文乱码问题
- struts2文件下载的时候,处理中文文件名的问题
- JSP、Struts2下载中文文件名乱码问题
- response.setHeader(...)下载中文文件名乱码问题
- flask下载文件中文IE,Edge,Safari文件名乱码
- 解决FlashFXP5 不能下载中文文件名文件的问题(显示文件名中文正常下载文件名是乱码)
- 解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题
- 解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题
- AJAX下Post表单(解决中文乱码问题)
- 阿里云centos7从零开始搭建python环境,到使用flask+nginx+gunicorn部署。(四)redis下载以及配置,和远程连接问题
- chrome下载文件名中文乱码问题
- 不同浏览器上中文文件名的下载问题
- 解决下载的默认文件名中的中文是乱码的问题!
- 关于android在TOMCAT服务器下载文件名带中文的文件的编码问题
- Java下载文件,文件名中文乱码问题
- JSP中,AJAX使用POST方式提交中文乱码问题解决