a标签实现文件下载;a标签下载文件header中带上用于鉴权的token;文件下载过大提示,网络出错

一、a标签实现文件下载

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>文件下载</title>
</head>
<body>
  <!-- href中直接引入要下载的文件即可 -->
  <a href="1.docx">下载</a>
  <!-- 点击按钮下载 -->
  <button onclick="dealDownLoad('1.docx')">下载</button>
<script>
  function dealDownLoad(url){
    var link = document.createElement("a");
    link.href = url;
    link.download = ""
    link.click();
  }
</script>
</body>
</html>

二、实现下载文件header中带上用于鉴权的token

1.方式1用的是原生的XmlHttpRequest

2.方式2用的是vue常用的axios

<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>文件下载</title>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
  <a href="#" class="download-url">下载</a>
  <script>
    //方式1
    $(".download-url").on("click", function (event) {
      event.preventDefault();//使a自带的方法失效,即无法调整到href中的URL
      var url = '';   //请求的URl,接口
      var xhr = new XMLHttpRequest();		//定义http请求对象
      xhr.open("post", url, true);//根据接口使用请求方式
      xhr.responseType = "blob";  // 返回类型blob
      xhr.setRequestHeader("accessToken", "此处获取token");
      xhr.setRequestHeader("Content-type", "application/application/octet-stream");
      //定义请求完成的处理函数,请求前可以增加加载框/禁用下载按钮逻辑
      xhr.onload = function () {
        if (this.status === 200) {
          //请求完成
          var blob = this.response;
          var reader = new FileReader();
          reader.readAsDataURL(blob);  // 转换为base64,可以直接放入a标签href
          reader.onload = function (e) {
            console.log(e);			//查看有没有接收到数据流
            // 转换完成,创建一个a标签用于下载
            var a = document.createElement('a');
            a.download = '';			//此处填写文件地址
            a.href = e.target.result;
            $("body").append(a);    // 修复firefox中无法触发click
            a.click();
            $(a).remove();
          }
        }
        else {
          alert("出现了未知的错误!");
        }
      }
      xhr.send();
    });

        //方式2
		/*$(".download-url").on("click",function(event){
			event.preventDefault();//使a自带的方法失效,即无法调整到href中的URL
			axios({
				method: 'post',
				url: "http://localhost:8050/file/export/snapEventVO",
				responseType: 'blob'
			}).then((res) => {
				const link = document.createElement('a')
				let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
			//获取heads中的filename文件名
			var aa = res.headers["content-disposition"]
			let temp = res.headers["content-disposition"].split(";")[1].split("filename=")[1];
			var fileName = decodeURIComponent(temp);
			console.log(fileName)
			link.style.display = 'none'
			link.href = URL.createObjectURL(blob);
			link.setAttribute('download', fileName)
			document.body.appendChild(link)
			link.click()
			document.body.removeChild(link)
		}).catch(error => {
				console.log(error)
			})
		});
*/
  </script>

</body>

三、使用第二种方式,当文件过大时,点击下载提示:文件下载失败-网络错误

原因:截取尺寸较大 导致生成base64长度太大,达到a标签的href上限
解决方案:将base64 dataURL转换为Blob文件对象

将 a.href = e.target.result; 改成  
a.href = URL.createObjectURL(dataURLToBlob(e.target.result));
如果是谷歌浏览器的话为
a.href = webkitURL.createObjectURL(dataURLToBlob(e.target.result));
function dataURLToBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值