以Chrome为例,在网页下载文件的时候,一般情况下都是点击一个链接,然后浏览器底部就会出现一条下载的任务。
但是有些产品的页面为了用户有更完整的体验,会在页面内实现一个实时的进度条。具体做法就是利用XMLHttpRequest
对象的onprogress
回调来实现。
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| const downloadURL = (url) => { const xmlhttp = new XMLHttpRequest(); xmlhttp.open('GET', url, true); xmlhttp.responseType = 'blob'; xmlhttp.onprogress = function (event) { console.log(event.loaded / event.total); }; xmlhttp.send(); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { if (msie) { navigator.msSaveOrOpenBlob(blob, name); return; } var blob = new Blob([xmlhttp.response], {type: 'image/png'}); var url1 = URL.createObjectURL(blob); let dllink = document.getElementById('dllink'); if (dllink === null) { dllink = document.createElement('a'); dllink.id = 'dllink'; dllink.download = 'name.bmp'; dllink.href = url1; document.body.appendChild(dllink); } dllink.click(); } }; }
|
需要注意的是:因为下载过程中文件是在内存中的,Blob
的大小不能超过500MB。