当前位置: 首页 > 面试题库 >

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

邵弘伟
2023-03-14
问题内容

我正在尝试使用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带有文件大小的标头。

这是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上进行测试。
您应该在生产时 删除它 :)



 类似资料:
  • 问题内容: 我目前有一个班级,应该在下载文件时向我展示一个简单的表格。它正在工作,但是进度条没有更新,下载完成后我只能看到它。有人能帮我吗? 问题答案: 您的是经典的Swing并发问题。解决方案始终如一-在后台线程中运行长时间的代码,例如可以在SwingWorker中找到的代码。 例如,

  • 我使用下载管理器api下载大文件,我也实现了。但问题是,下载进度通知显示在状态栏中。但是我想用进度条在活动中显示通知。有人做过吗,如果有请帮帮我。

  • 我正在尝试写一个简单的应用程序得到更新。为此,我需要一个简单的函数,可以下载一个文件,并在中显示当前的进度。我知道如何执行,但我不确定如何显示当前进度以及如何首先下载文件。

  • 本文向大家介绍Python HTTP下载文件并显示下载进度条功能的实现,包括了Python HTTP下载文件并显示下载进度条功能的实现的使用技巧和注意事项,需要的朋友参考一下 下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条。 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: 下面的例子是题目中完整的例子

  • 本文向大家介绍Python 给下载文件显示进度条和下载时间的实现,包括了Python 给下载文件显示进度条和下载时间的实现的使用技巧和注意事项,需要的朋友参考一下 大家在下载文件时能够显示下载进度和时间非常好,其实实现它方法很简单,这里我写了个进度条的模块,其中还附带上了运行时间也就是下载时间了。 该模块调用了三个库: 1.os 2.requests 3.time 话不多说,先上代码!!!. 实现

  • 问题内容: 我正在尝试使用jQuery AJAX下载二进制音频文件。 通常我只会发出这样的命令: 但是,最近我们的服务器等待时间太长,无法响应,并且我收到了令人讨厌的网关超时消息。 有人建议我改用jQuery AJAX,从那时起我就可以更好地控制超时了。 这是到目前为止我玩过的代码: 当我省略“ dataType”时,二进制文件的传输量大约是服务器上实际文件传输量的三倍。但是,当我使dataTyp