• <legend id='2rRdD'><style id='2rRdD'><dir id='2rRdD'><q id='2rRdD'></q></dir></style></legend>
    1. <small id='2rRdD'></small><noframes id='2rRdD'>

    2. <tfoot id='2rRdD'></tfoot>

      1. <i id='2rRdD'><tr id='2rRdD'><dt id='2rRdD'><q id='2rRdD'><span id='2rRdD'><b id='2rRdD'><form id='2rRdD'><ins id='2rRdD'></ins><ul id='2rRdD'></ul><sub id='2rRdD'></sub></form><legend id='2rRdD'></legend><bdo id='2rRdD'><pre id='2rRdD'><center id='2rRdD'></center></pre></bdo></b><th id='2rRdD'></th></span></q></dt></tr></i><div id='2rRdD'><tfoot id='2rRdD'></tfoot><dl id='2rRdD'><fieldset id='2rRdD'></fieldset></dl></div>
          <bdo id='2rRdD'></bdo><ul id='2rRdD'></ul>
      2. 显示使用 XHR2/AJAX 下载文件的进度条

        时间:2023-05-16
        <legend id='GZmTy'><style id='GZmTy'><dir id='GZmTy'><q id='GZmTy'></q></dir></style></legend>
        • <small id='GZmTy'></small><noframes id='GZmTy'>

            <i id='GZmTy'><tr id='GZmTy'><dt id='GZmTy'><q id='GZmTy'><span id='GZmTy'><b id='GZmTy'><form id='GZmTy'><ins id='GZmTy'></ins><ul id='GZmTy'></ul><sub id='GZmTy'></sub></form><legend id='GZmTy'></legend><bdo id='GZmTy'><pre id='GZmTy'><center id='GZmTy'></center></pre></bdo></b><th id='GZmTy'></th></span></q></dt></tr></i><div id='GZmTy'><tfoot id='GZmTy'></tfoot><dl id='GZmTy'><fieldset id='GZmTy'></fieldset></dl></div>

              • <bdo id='GZmTy'></bdo><ul id='GZmTy'></ul>
                <tfoot id='GZmTy'></tfoot>

                  <tbody id='GZmTy'></tbody>

                1. 本文介绍了显示使用 XHR2/AJAX 下载文件的进度条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  限时送ChatGPT账号..

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

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

                  注意:文件属于不同类型.

                  提前致谢.

                  JS

                  //文件下载filelist.on('click', '.download_link', function(e){e.preventDefault();var id = $(this).data('id');$(this).parent().addClass("download_start");$.ajax({xhr: 函数 () {var xhr = 新窗口.XMLHttpRequest();//处理下载进度xhr.addEventListener("进度", function (evt) {如果(evt.lengthComputable){var percentComplete = evt.loaded/evt.total;console.log(percentComplete);}}, 错误的);返回xhr;},完成:函数(){console.log("请求完成");}})});

                  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">'.日期(M d,Y",$file_upload_time).' &#149;&nbsp;'.human_filesize($file_size) .'</div></div><div class="right_wing"><div 类="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="删除这个?"></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">点击下载</div><脚本>$('#a1').click(function() {var that = this;var page_url = 'download.php';var req = new XMLHttpRequest();req.open("POST", page_url, true);req.addEventListener("进度", function (evt) {如果(evt.lengthComputable){var percentComplete = evt.loaded/evt.total;console.log(percentComplete);}}, 错误的);req.responseType = "blob";req.onreadystatechange = function () {如果(req.readyState === 4 && req.status === 200){var filename = $(that).data('filename');if (typeof window.chrome !== 'undefined') {//铬版本var link = document.createElement('a');link.href = window.URL.createObjectURL(req.response);link.download = 文件名;链接.click();} else if (typeof window.navigator.msSaveBlob !== 'undefined') {//IE版本var blob = new Blob([req.response], { type: 'application/force-download' });window.navigator.msSaveBlob(blob, 文件名);} 别的 {//火狐版本var file = new File([req.response], filename, { type: 'application/force-download' });window.open(URL.createObjectURL(file));}}};req.send();});</脚本>

                  下面是你可以使用的 php 代码示例:

                  <块引用>

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

                  I am trying to download files using Ajax and show a custom download progress bar.

                  The problem is I can't understand how to do so. I wrote the code to log the progress but don't know how to initiate the download.

                  NOTE: The files are of different types.

                  Thanks in advance.

                  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 and 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>
                  

                  解决方案

                  If you want to show the user a progress-bar of the downloading process - you must do the download within the xmlhttprequest. One of the problems here is that if your files are big - they will be saved in the memory of the browser before the browser will write them to the disk (when using the regular download files are being saved directly to the disk, which saves a lot of memory on big files).

                  Another important thing to note - in order for the lengthComputable to be true - your server must send the Content-Length header with the size of the file.

                  Here is the javascript code:

                  <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>
                  

                  And here is an example for the php code you can use:

                  <?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 :)

                  这篇关于显示使用 XHR2/AJAX 下载文件的进度条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                    <tbody id='FFMfF'></tbody>
                  • <legend id='FFMfF'><style id='FFMfF'><dir id='FFMfF'><q id='FFMfF'></q></dir></style></legend>
                      <bdo id='FFMfF'></bdo><ul id='FFMfF'></ul>

                      <tfoot id='FFMfF'></tfoot>

                    • <i id='FFMfF'><tr id='FFMfF'><dt id='FFMfF'><q id='FFMfF'><span id='FFMfF'><b id='FFMfF'><form id='FFMfF'><ins id='FFMfF'></ins><ul id='FFMfF'></ul><sub id='FFMfF'></sub></form><legend id='FFMfF'></legend><bdo id='FFMfF'><pre id='FFMfF'><center id='FFMfF'></center></pre></bdo></b><th id='FFMfF'></th></span></q></dt></tr></i><div id='FFMfF'><tfoot id='FFMfF'></tfoot><dl id='FFMfF'><fieldset id='FFMfF'></fieldset></dl></div>

                        <small id='FFMfF'></small><noframes id='FFMfF'>