js实现文件下载功能

js实现文件下载功能,第1张

一、a标签下载

<body>
	<button onClick="download()">a标签下载button>
	<script>
		function download(url = 'http:www.xxx.com/download?name=file.pdf', fileName = '未知文件') {
	      const a = document.createElement('a');
	      a.style.display = 'none';
	      a.setAttribute('target', '_blank');
	      /*
	       * download的属性是HTML5新增的属性
	       * href属性的地址必须是非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目(调用后台的接口),这时download就会不起作用。
	       * 此时,如果是下载浏览器无法解析的文件,例如.exe,.xlsx..那么浏览器会自动下载,但是如果使用浏览器可以解析的文件,比如.txt,.png,.pdf....浏览器就会采取预览模式
	       * 所以,对于.txt,.png,.pdf等的预览功能我们就可以直接不设置download属性(前提是后端响应头的Content-Type: application/octet-stream,如果为application/pdf浏览器则会判断文件为 pdf ,自动执行预览的策略)
	       */
	      fileName && a.setAttribute('download', fileName);
	      a.href = url;
	      document.body.appendChild(a);
	      a.click();
	      document.body.removeChild(a);
	    }
	script>
body>

优点:

可以直接下载txt、png、pdf、exe、xlsx等类型文件

缺点:

a标签只能做get请求,所以url有长度限制无法获取下载进度跨域限制无法在header中携带token做鉴权 *** 作无法判断接口是否成功IE兼容问题

二、window.open下载

<body>
  <button onclick="download('http://www.xxx.com/download?name=file.pdf')">window.open下载button>
  <script>
    function download(url) {
      window.open(url, '_self');
      /**
       *  _blank:在新窗口显示目标网页
       *  _self:在当前窗口显示目标网页
       *  _top:框架网页中在上部窗口中显示目标网页
      /**
    }
  script>
body>

优点:

简单方便

缺点:

会出现URL长度限制问题需要注意url编码问题无法获取下载进度无法在header中携带token做鉴权 *** 作无法判断接口是否成功无法直接下载浏览器可直接预览的文件类型(txt、png、pdf会直接预览)

三、location.href 下载

<body>
  <button onclick="download('http://www.xxx.com/download?name=file.pdf')">location.href下载
  button>
  <script>
    function download(url) {
      window.location.href = url;
    }
  script>
body>

优点

简单方便直接可以下载大文件(G以上)

缺点

会出现URL长度限制问题需要注意url编码问题无法获取下载进度无法在header中携带token做鉴权 *** 作无法直接下载浏览器可直接预览的文件类型(txt、png、pdf会直接预览)无法判断接口是否返回成功

三、文件流转blob对象下载

 <button onclick="download()">文件流转blob对象下载button>
 <script>
 	download() {
 		axios({
 			url: 'http://www.xxx.com/download',
 			method: 'get',
 			responseType: 'blob',
 		}).then(res => {
 			const fileName = res.headers.content-disposition.split(';')[1].split('filename=')[1];
 			const filestream = res.data;  // 返回的文件流
 			// {type: 'application/vnd.ms-excel'}指定对应文件类型为.XLS (.XLS的缩写就为application/vnd.ms-excel)
 			const blob = new Blob([filestream], {type: 'application/vnd.ms-excel'});
 			const a = document.createElement('a');
 			const href = window.URL.createObjectURL(blob); // 创建下载连接
		    a.href = href;
		    a.download = decodeURL(fileName );
		    document.body.appendChild(a);
	        a.click();
	        document.body.removeChild(a); // 下载完移除元素
	        window.URL.revokeObjectURL(href); // 释放掉blob对象
 		})
 	}
 script>

优点:

可以下载txt、png、pdf等类型文件可以在header中携带token做鉴权 *** 作可以获取文件下载进度可以判断接口是否返回成功

缺点:

兼容性问题,IE10以下不可用,注意Safari浏览器,官网给出 Safari has a serious issue with blobs that are of the type application/octet-stream将后端返回的文件流全部获取后才会下载

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/930707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存