上面的代码如果文件很大,浏览器不会立即出现下载进度条
时间: 2024-03-08 17:47:53 浏览: 82
文件下载带进度条的哦很实用
是的,当下载的文件非常大时,浏览器可能需要一些时间来处理文件并弹出下载对话框,这会导致用户看不到下载进度条。为了解决这个问题,可以使用 JavaScript 来实时更新下载进度条。
具体做法是,在 PHP 文件中设置一个响应头,告诉浏览器文件的大小和类型。然后,在 JavaScript 中使用 XMLHttpRequest 对象发送异步请求下载文件,并实时更新下载进度条。
以下是一个简单的示例代码:
PHP 文件:
```
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="filename.ext"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
$chunk_size = 1024 * 1024; // 每次读取 1MB 数据
$handle = fopen($file, 'rb');
while (!feof($handle)) {
echo fread($handle, $1024 * 1024);
ob_flush();
flush();
}
fclose($handle);
```
JavaScript 文件:
```
function downloadFile(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
// 创建一个下载链接并模拟点击
var blob = new Blob([this.response], {type: 'application/octet-stream'});
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'filename.ext';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
};
xhr.onprogress = function(e) {
if (e.lengthComputable) {
// 更新下载进度条
var percent = Math.round((e.loaded / e.total) * 100);
updateProgressBar(percent);
}
};
xhr.send();
}
function updateProgressBar(percent) {
// 更新下载进度条的样式或文本
// ...
}
```
在上面的示例代码中,`downloadFile()` 函数使用 XMLHttpRequest 对象发送异步请求下载文件。在 onload 和 onprogress 事件处理函数中,分别处理下载完成和下载进度的更新。在下载完成时,使用 Blob 对象创建一个下载链接并模拟点击,弹出下载对话框。在更新下载进度时,调用 `updateProgressBar()` 函数更新下载进度条的样式或文本。
阅读全文