站长资讯网
最全最丰富的资讯网站

javascript 怎么实现下载功能

javascript实现下载功能的方法:1、通过a标签实现下载;2、通过“window.open”方法实现下载;3、通过“location.href”方法实现下载;4、通过文件流转blob对象实现下载功能。

javascript 怎么实现下载功能

本教程操作环境:Windows10系统、javascript1.8.5版本、Dell G3电脑。

javascript 怎么实现下载功能?

js实现文件下载功能

一、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

  • 将后端返回的文件流全部获取后才会下载

推荐学习:《JavaScript视频教程》

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号