栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

显示使用XHR2 / AJAX下载文件的进度条

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

显示使用XHR2 / AJAX下载文件的进度条

如果要向用户显示下载过程的进度条,则必须在xmlhttprequest中进行下载。这里的问题之一是,如果您的文件很大-它们将被保存 浏览器
的内存 中,然后浏览器会将它们写入磁盘(使用常规下载文件时,它们将被直接保存到磁盘中,这会保存一个大文件上的大量内存)。

要注意的另一件重要事情-为了

lengthComputable
使它正确-服务器必须发送
Content-Length
带有文件大小的标头。

这是Javascript代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div id="a1" data-filename="filename.xml">Click to download</div><script>$('#a1').click(function() {    var that = this;    var page_url = 'download.php';    var req = new XMLHttpRequest();    req.open("POST", page_url, true);    req.addEventListener("progress", function (evt) {        if(evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; console.log(percentComplete);        }    }, false);    req.responseType = "blob";    req.onreadystatechange = function () {        if (req.readyState === 4 && req.status === 200) { var filename = $(that).data('filename'); if (typeof window.chrome !== 'undefined') {     // Chrome version     var link = document.createElement('a');     link.href = window.URL.createObjectURL(req.response);     link.download = filename;     link.click(); } else if (typeof window.navigator.msSaveBlob !== 'undefined') {     // IE version     var blob = new Blob([req.response], { type: 'application/force-download' });     window.navigator.msSaveBlob(blob, filename); } else {     // Firefox version     var file = new File([req.response], filename, { type: 'application/force-download' });     window.open(URL.createObjectURL(file)); }        }    };    req.send();});</script>

这是您可以使用的php代码的示例:

<?php$filename = "some-big-file";$filesize = filesize($filename);header("Content-Transfer-Encoding: Binary");header("Content-Length:". $filesize);header("Content-Disposition: attachment");$handle = fopen($filename, "rb");if (FALSE === $handle) {    exit("Failed to open stream to URL");}while (!feof($handle)) {    echo fread($handle, 1024*1024*10);    sleep(3);}fclose($handle);

请注意,我添加了一个睡眠来模拟慢速连接以在localhost上进行测试。
您应该在生产时 删除它 :)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394736.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号