在vue框架中, 接收并下载文件流(blob对象)
  可以通过将其转成blob对象,添加到a标签或者iframe标签中来模拟下载(或者pdf预览)

1.首先设置responseType对象格式为 blob:
  responseType:‘blob’

在项目reques.js文件中 添加请求头的相关配置 如header responseType 等
config.headers['Authorization'] = getToken()
      if(config.responseType){
        config.responseType = 'blob'
      }
在api.js文件中   添加responseType:'blob'参数
//授权码下载 
export function downloadcode(query) {
  return request({
    url: '/authCode/download',
    method: 'get',
    params: query,
    responseType:'blob'
  })
}
项目页面中:
//下载方法
    handleDown(row) {
      const data = {
        id:row.id
      }
      downloadcode(data).then(res => {
        console.log("下载的文件流",res)
        const link=document.createElement('a');
        try{
	          // let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});    //如果后台返回的不是blob对象类型,先定义成blob对象格式
	          let blob =  res.data    //如果后台返回的直接是blob对象类型,直接获取数据
	          let _fileName = res.headers['content-disposition'].split(';')[1].split('=')[1]; //拆解获取文件名,
	          link.style.display='none';
	          
	          方法1: 创建--下载--销毁
	          // 兼容不同浏览器的URL对象
	          const url = window.URL || window.webkitURL || window.moxURL;
	          link.href=url.createObjectURL(blob);
	          link.download = _fileName;   //下载的文件名称
	          link.click();
	          window.URL.revokeObjectURL(url);  //  #URL.revokeObjectURL()方法会释放一个通过URL.createObjectURL()创建的对象URL. 当你要已经用过了这个对象URL,然后要让浏览器知道这个URL已经不再需要指向对应的文件的时候,就需要调用这个方法.

			方法2:  创建--下载--销毁
			   // 兼容不同浏览器的URL对象
	          const url = window.URL || window.webkitURL || window.moxURL;
	          link.href=url.createObjectURL(blob);
	          link.setAttribute('download'_fileName.substring(_fileName.lastIndexOf('_')+1)));
              document.body.appendChild(link);
              link.click();
              document.body.removeChild(link);
              url.revokeObjectURL(link.href);//销毁url对象
        }catch (e) {
          console.log('下载的文件出错',e)
        }
      })
    },

返回的文件流 示例:
在这里插入图片描述

axios get 请求方式

	axios.get(`/dev-api/authCode/download?id=`+row.id,
        { //请求头需要的一些配置
          headers:{
              "Authorization":getToken()
            },
          responseType: 'blob',//设置返回类型
        }
     ).then((res)=>{
        console.log('下载的文件',res)
        const link=document.createElement('a');
        try{
	          let blob =  res.data
	          let _fileName = res.headers['content-disposition'].split(';')[1].split('=')[1];//文件名,中文无法解析的时候会显示 _(下划线),生产环境获取不到
	          link.style.display='none';
	          // 兼容不同浏览器的URL对象
	          const url = window.URL || window.webkitURL || window.moxURL;
	          link.href=url.createObjectURL(blob);
	          link.download = _fileName;
	          link.click();
	          window.URL.revokeObjectURL(url);
        }catch (e) {
          console.log('下载的文件出错',e)
        }
      }).catch(()=>{
        console.log('下载的文件出错')
      })  

参考:https://www.cnblogs.com/raymond-yan/p/10364120.html
https://blog.csdn.net/clmmei_123/article/details/108105046

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐