ajax post下载flask文件流以及中文文件名问题

 更新时间:2020年04月02日 10:24:43   作者:levinit  
这篇文章主要介绍了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文件流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过Ajax两种方式讲解Struts2接收数组表单的方法

    通过Ajax两种方式讲解Struts2接收数组表单的方法

    使用struts2表单传值,可以传一个或者是作为一个对象的各个属性传,都非常灵活便捷。但是如果我们需要传一个数组并希望struts正确接收,该怎么处理呢?接下来,通过本文给大家介绍通过Ajax两种方式讲解Struts2接收数组表单的方法,需要的朋友可以参考下
    2015-10-10
  • PHP+AJAX无刷新实现返回天气预报数据

    PHP+AJAX无刷新实现返回天气预报数据

    天气数据是通过采集中国气象网站的。本来中国天气网站也给出了数据的API接口,接下来为大家介绍下用php来写一个天气预报的模块,感兴趣的朋友可以参考下
    2013-07-07
  • ajax实例入门代码

    ajax实例入门代码

    想学习ajax的朋友,如果刚开始接触可以查看脚本之家的ajax栏目,之前的一些文章。
    2008-11-11
  • Ajax实现图片上传并预览功能

    Ajax实现图片上传并预览功能

    这篇文章主要介绍了Ajax实现图片上传并预览,需要的朋友可以参考下
    2018-06-06
  • Ajax返回数据之前的loading等待效果

    Ajax返回数据之前的loading等待效果

    我们通过ajax请求,向后台传递参数,然后后台经过一系列的运算之后向前台返还数据,我希望在等待数据成功返还之前可以展示一个loading.gif图。接下来通过本文给大家分享Ajax返回数据之前的loading等待效果,需要的朋友可以参考下
    2017-08-08
  • ajax动态查询数据库数据并显示在前台的方法

    ajax动态查询数据库数据并显示在前台的方法

    今天小编就为大家分享一篇ajax动态查询数据库数据并显示在前台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Ajax方式实现定期更新页面某块内容的方法

    Ajax方式实现定期更新页面某块内容的方法

    这篇文章主要介绍了Ajax方式实现定期更新页面某块内容的方法,涉及jquery中load方法Ajax调用及setInterval定时执行的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Ajax基础与登入教程

    Ajax基础与登入教程

    Ajax 是 Asynchronous JavaScript and XML的缩写。其优点可以减轻服务器的负担,按需取数据,最大程度的减少冗余请求。接下来通过本文给大家介绍Ajax基础与登入教程,需要的的朋友参考下
    2017-03-03
  • 原生ajax写的上拉加载实例

    原生ajax写的上拉加载实例

    下面小编就为大家分享一篇原生ajax写的上拉加载实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 零基础学习AJAX之AJAX框架

    零基础学习AJAX之AJAX框架

    本文是零基础学习AJAX系列教程的第二篇,我们介绍点不一样的知识,学习下ajaxLib和ajaxGold两款框架,方便我们更好的理解ajax.
    2015-01-01

最新评论