上传文件时监控读取进度,显现进度条

我们在运用异步事宜处置惩罚时还能趁便取得一项上风,那就是可以监控文件的读取进度;这关于读取大文件、查找毛病和展望读取完成时候异常有用。

onloadstartonprogress 事宜可用于监控读取进度。

以下示例演示了怎样经由过程显现进度条来监控读取状况。要检察进度指示器的实际效果,请尝试读取大文件或长途驱动器中的文件。

<style>
  #progress_bar {
    margin: 10px 0;
    padding: 3px;
    border: 1px solid #000;
    font-size: 14px;
    clear: both;
    opacity: 0;
    -moz-transition: opacity 1s linear;
    -o-transition: opacity 1s linear;
    -webkit-transition: opacity 1s linear;
  }
  #progress_bar.loading {
    opacity: 1.0;
  }
  #progress_bar .percent {
    background-color: #99ccff;
    height: auto;
    width: 0;
  }
</style>

<input type="file" id="files" name="file" />
<button onclick="abortRead();">作废读取</button>
<div id="progress_bar"><div class="percent">0%</div></div>

<script>
  var reader;
  var progress = document.querySelector('.percent');

  function abortRead() {
    reader.abort();
  }
  // 文件上传失足后的函数
  function errorHandler(e) {
    switch(e.target.error.code) {
      case e.target.error.NOT_FOUND_ERR:
        alert('文件没找到');
        break;
      case e.target.error.NOT_READABLE_ERR:
        alert('文件不可读');
        break;
      case e.target.error.ABORT_ERR:
        break;
      default:
        alert('读取文件时失足');
    };
  }
  // 更新进度条
  function updateProgress(e) {
    // e 是一个 ProgressEvent.
    if (e.lengthComputable) {
      var percentLoaded = Math.round((e.loaded / e.total) * 100);
      // 更新进度条长度
      if (percentLoaded < 100) {
        progress.style.width = percentLoaded + '%';
        progress.textContent = percentLoaded + '%';
      }
    }
  }
  // 挑选上传文件后的要领
  function handleFileSelect(e) {
    // 在挑选新文件后重置进度指示器
    progress.style.width = '0%';
    progress.textContent = '0%';

    reader = new FileReader();
    reader.onerror = errorHandler;
    reader.onprogress = updateProgress;
    reader.onabort = function(e) {
      alert('已作废读取');
    };
    reader.onloadstart = function(e) {
      document.getElementById('progress_bar').className = 'loading';
    };
    reader.onload = function(e) {
      // 确保进度条末了显现100%
      progress.style.width = '100%';
      progress.textContent = '100%';
      setTimeout("alert('文件已读取胜利!')", 0);
    }

    // 将文件作为二进制字符串读入
    reader.readAsBinaryString(e.target.files[0]);
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

提醒:要检察进度指示器的实际效果,请尝试读取大文件或长途驱动器中的资本。

    原文作者:艾欢欢
    原文地址: https://segmentfault.com/a/1190000019308106
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞