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
-
将后端返回的文件流全部获取后才会下载
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanfbjag
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01