js vue 获取服务端返回的文件的原始文件名
前端 js vue 获取服务端返回的文件的原始文件名前端文件下载的几种方式后端直接给文件url,这种情况很简单,直接将url付给a标签,a标签加上download属性即可后端返回的是文件流,但是请求是get请求此种情况下,要获取文件原始文件名,也简单。一种是使用window.open(url),一种是直接将请求地址给a标签后端由于需要,只能使用post请求(比如下载文件时需要携带过多的参数),使用
前端 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 解码即可
更多推荐
所有评论(0)