1.get请求

思路:直接a标签跳转,地址栏传参即可,让后端在接口就整好文件,跳转下载

<a
   key="list-loadmore-edit"
   href={'url'}
>
  <Button>下载</Button>
</a>

2.post请求

思路:利用js创建a标签,并设置样式隐藏与下载属性后直接利用js触发a标签,触发完毕后移除a标签

根据后端如果返回的是二进制流文件,那么responseType必须为blob
// 应用下载
export async function downLoadAppPack(params) {
  return request('/SaasBuilderService/pack/app/download', {
    method: 'POST',
    body: params,
    responseType: 'blob'	//确保返回值类型处理成blob对象
  });
}

downLoadAppPack(params).then(res=>{

    const link = doucment.createElement('a')	//创建a标签
    link.style.display = 'none'	//隐藏
    link.href = URL.createObjectURL(res)	//设置a标签href
    link.setAttribute('download',`定义包名.rpk`)	//设置a标签下载属性
    doucment.body.appendChild(link)		//添加a标签
    link.click()	//触发a标签
    doucment.body.removeChild(link)		//移除a标签
    
})

完整写法

通过借助new FileReader创建出来的文件实例中的方法,将 Blob 或者 File 对象转根据特殊的编码格式转化为内容(字符串形式)

readAsText()这个方法是异步的,也就是说,只有当执行完成后才能够查看到结果,如果直接查看是无结果的,并返回undefined

也就是说必须要挂载 实例下的 onload 或 onloadend 的方法处理转化后的结果

onClick={() => {
    let { packageNo, platform, quickAppName } = text
    let parmas = { packageNo, platform, quickAppName }	//获取外部参数,可以忽视
    
    downLoadAppPack(parmas).then(res => {
  		let BLOB = new Blob([res]);
        var reader = new FileReader();
        reader.onload = function (event) {
        	let reg = /"subCode":(.*?),"data"/igs   //正则提取subCode 有返回数组,无返回null
            // 检查是否含有subCode,判断该次请求是否正常
            if (reg.exec(event.target.result)) {
                let obj = JSON.parse(event.target.result)
                if (obj.subCode == '500') {
                    message.error(obj.message)
                }
            } else {
                let url = window.URL.createObjectURL(BLOB);
                let link = document.createElement('a');
                link.style.display = 'none';
                link.href = url;
                link.setAttribute('download', `${fileName}.rpk`);
                document.body.appendChild(link);
                link.click();
            }
        };
        reader.readAsText(BLOB)
    })

3.原生xhr获取响应头里的字段

 	req.open('POST', '/SaasBuilderService/pack/app/download', true);
    req.setRequestHeader("Content-type", "application/json; charset=utf-8");
    req.responseType = 'blob'
    req.onload = function () {
        if (this.status === 200) {
            let res = this.response;  // this.response也就是请求的返回就是Blob对象
            / 获取filename
            let filename = req.getResponseHeader('content-disposition').split(";")[1].split("fileName=")[1];
            let iconv = require('iconv-lite');	//用于转译乱码fileName
            iconv.skipDecodeWarning = true;//忽略警告
            let fileName = iconv.decode(filename, 'utf-8');
            // 二进制流转blob
            let blob = new Blob([res], { type: "application/octet-stream" });
            const link = document.createElement('a')
            link.style.display = 'none'
            link.href = URL.createObjectURL(blob)
            link.setAttribute('download', `${fileName}`)
            document.body.appendChild(link)
            link.click()
            document.body.removeChild(link)
   		}
   }
   req.send(JSON.stringify(parmas));