前端 js vue 获取服务端返回的文件的原始文件名

前端 js vue 获取服务端返回的文件的原始文件名

前端文件下载的几种方式

  • 后端直接给文件url,
    这种情况很简单,直接将url付给a标签,a标签加上download属性即可

  • 后端返回的是文件流,但是请求是get请求
    此种情况下,要获取文件原始文件名,也简单。一种是使用window.open(url),一种是直接将请求地址给a标签

  • 后端由于需要,只能使用post请求(比如下载文件时需要携带过多的参数),使用这种方式获取下载文件的原始文件名,比之前两种麻烦些,本文重点说的是这种情况

    思路如下:
    1) 使用ajax发起请求,指定接收类型为blob
    2)读取请求返回的头部信息里的content-disposition,返回的文件名就在这里面
    3)使用URL.createObjectURL将请求的blob数据转为可下载的url地址
    4)使用a标签下载

    代码:

    export const downloadFile = (url,data)=>{
    function down(fileUrl,fileName){
    fileName=decodeURIComponent(fileName)
    let a=document.createElement('a')
    a.setAttribute('href',fileUrl)
    a.setAttribute('download',fileName)
    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
    }
    axios({
      url,
      data,
      responseType:'blob',
      method:'POST',
    }).then(res=>{
      let data=res.data
      let dis= res.headers['content-disposition']
      let url=URL.createObjectURL(data)
      let fileName=dis.split('attachment;filename=')[1]
      down(url,fileName)
    })
    

}
````
需要说明的是,content-disposition 取值是res.headers[‘content-disposition’],res.headers[‘content-disposition’] 的值是如下类型字符串 attachment;filename=xxx.xlsx,需要自己切分。另外,如果文件名是中文,则需要后端配合转码,后端在发送文件时,组要将文件名进行java.net.URLEncoder.encode(fileName, “UTF8”) 转码,否则前端接收到的 res.headers[‘content-disposition’] 的中文信息是乱码的。后端转码后,前端通过decodeURIComponent 解码即可

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆片片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值