gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:33:06 24 4
gpt4 key购买 nike

我正在尝试使用 Ajax 下载文件并显示自定义下载进度条。

问题是我不明白该怎么做。我编写了代码来记录进度,但不知道如何启动下载。

注意:文件的类型不同。

提前致谢。

JS

// Downloading of files
filelist.on('click', '.download_link', function(e){
e.preventDefault();
var id = $(this).data('id');
$(this).parent().addClass("download_start");

$.ajax({
xhr: function () {
var xhr = new window.XMLHttpRequest();
// Handle Download Progress
xhr.addEventListener("progress", function (evt) {
if(evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
console.log(percentComplete);
}
}, false);
return xhr;
},
complete: function () {
console.log("Request finished");
}
})
});

HTML 和 PHP

    <li>
<div class="f_icon"><img src="' . $ico_path . '"></div>
<div class="left_wing">
<div class="progressbar"></div>
<a class="download_link" href="#" id="'.$file_id.'"><div class="f_name">' . $full_file_name . '</div></a>
<div class="f_time_size">' . date("M d, Y", $file_upload_time) . '&nbsp; &#149; &nbsp;' . human_filesize($file_size) . '</div>
</div>

<div class="right_wing">
<div class="f_delete">
<a class="btn btn-danger" href="#" aria-label="Delete" data-id="'.$file_id.'" data-filename="'.$full_file_name.'"><i class="fa fa-trash-o fa-lg" aria-hidden="true" title="Delete this?"></i>
</a>
</div>
</div>
</li>

最佳答案

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

另一个需要注意的重要事项 - 为了使 lengthComputable 为真 - 您的服务器必须发送包含文件大小的 Content-Length header 。

这是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);

Note that I added a sleep to simulate a slow connection for testing on localhost.
You should remove this on production :)

关于javascript - 使用 XHR2/AJAX 显示下载文件的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com