HTML5 文件域+FileReader 分段读取文件(五)

我会带着你远行 2024-02-18 21:24 118阅读 0赞

一、默认FileReader会分段读取File对象,这是分段大小不一定,并且一般会很大

HTML:

复制代码

  1. <div class="container">
  2. <!--文本文件验证-->
  3. <input type="file" id="file" />
  4. <h4>选择文件如下:</h4>
  5. <blockquote></blockquote>
  6. </div>

复制代码

JS:

复制代码

  1. //读取文本文件实例
  2. var fileBox = document.getElementById('file');
  3. fileBox.onchange = function () {
  4. showFiles();
  5. }
  6. function showFiles() {
  7. //获取选择文件的数组
  8. var fileList = fileBox.files;
  9. for (var i = 0; i < fileList.length; i++) {
  10. var file = fileList[i];
  11. readFile(file);
  12. }
  13. }
  14. //读取文件内容
  15. function readFile(file) {
  16. var reader = new FileReader();
  17. //中文windows系统 txt 文本多数默认编码 gbk
  18. reader.readAsText(file, 'gbk');
  19. reader.onprogress = function (e) {
  20. //默认情况下也是分段读取,
  21. //默认情况下,每次分段大小不确定,不同浏览器也不相同
  22. //第一次读取比较小 Google每段:8028160(7.65625mb) FF每段:786432(768mb) IE下:4096(4k)
  23. console.info(e);
  24. }
  25. reader.onload = function (e) {
  26. var result = reader.result;
  27. console.info(e.loaded);
  28. }
  29. }

复制代码

二、分段读取文本文件+进度条实例,并解决IE浏览器崩溃问题

HTML:

复制代码

  1. <div class="container">
  2. <div class="panel panel-default">
  3. <div class="panel-heading">分段读取文件:</div>
  4. <div class="panel-body">
  5. <input type="file" id="file" />
  6. <input type="button" id="abort" value="中断" />
  7. <input type="button" id="containue" value="继续读取文件" />
  8. <p>
  9. <label>读取进度:</label><progress id="Progress" style="width:300px;" value="0" max="100"></progress>
  10. </p>
  11. <p id="Percent"></p>
  12. <p id="Status"></p><hr />
  13. <blockquote style="word-break:break-all;"></blockquote>
  14. </div>
  15. </div>
  16. </div>

复制代码

JS:

复制代码

  1. var read = {
  2. //初始化绑定
  3. init: function () {
  4. var _this = this;
  5. _this.status = document.getElementById('Status');
  6. _this.progress = document.getElementById('Progress');
  7. _this.percent = document.getElementById('Percent');
  8. document.getElementById('file').onchange = _this.fileHandler;
  9. document.getElementById('abort').onclick = _this.abortHandler;
  10. document.getElementById('containue').onclick = _this.containueHandler;
  11. _this.loaded = 0;
  12. //每次读取1M
  13. _this.step = 3 * 2;
  14. },
  15. //当有选中文件时,事件处理
  16. fileHandler: function (e) {
  17. //读取文件
  18. var _this = read;
  19. //获取上传文件
  20. var file = _this.file = this.files[0];
  21. var reader = _this.reader = new FileReader();
  22. //绑定信息和事件
  23. _this.total = file.size;
  24. _this.isabort = false;//标记正在读取还是以已经中止
  25. reader.onprogress = _this.onProgress;
  26. reader.onabort = _this.onAbort;
  27. reader.onerror = _this.onError;
  28. reader.onload = _this.onLoad;
  29. //从头读取一块
  30. _this.readBlob(0);
  31. $('blockquote').empty();
  32. },
  33. //中断 操作
  34. abortHandler: function (e) {
  35. var _this = read;
  36. if (_this.reader) {
  37. console.log('读取操作操作中止,' + _this.loaded);
  38. _this.isabort = true;
  39. _this.reader.abort();
  40. }
  41. },
  42. //继续操作
  43. containueHandler: function (e) {
  44. var _this = read;
  45. _this.isabort = false;
  46. console.info('继续:' + _this.loaded);
  47. //继续读取
  48. _this.readBlob(_this.loaded);
  49. },
  50. //读取过程
  51. onProgress: function (e) {
  52. var _this = read;
  53. if (e.lengthComputable == false)
  54. return;
  55. _this.loaded += e.loaded;
  56. //更新进度条
  57. var value = (_this.loaded / _this.total) * 100;
  58. _this.percent.innerText = value;
  59. _this.progress.value = value;
  60. },
  61. //中止上传事件
  62. onAbort: function () {
  63. var _this = read;
  64. //console.log('读取操作操作中止,'+_this.loaded);
  65. },
  66. //当出现异常时
  67. onError: function () { },
  68. //读取成功 结束
  69. onLoad: function (e) {
  70. var _this = read;
  71. var result = _this.reader.result;
  72. $('blockquote').append(result);
  73. //判断是否已经读到最后,如果没有继续读取
  74. if (_this.loaded < _this.total) {
  75. //IE 浏览器下,事件触发速度太快,页面容易出现假死现象,解决方案延缓事件触发
  76. setTimeout(function () {
  77. _this.readBlob(_this.loaded);
  78. }, 10);
  79. //直接使用在Google,FF没问题
  80. // _this.readBlob(_this.loaded);
  81. } else {
  82. _this.loaded = _this.total;
  83. }
  84. },
  85. readBlob: function (start) {
  86. var _this = read;
  87. if (_this.isabort)
  88. return;
  89. var file = _this.file;
  90. var blob = file.slice(start, start + _this.step);
  91. _this.reader.readAsText(blob, 'gbk');
  92. }
  93. };
  94. read.init();

复制代码

三、分段读取文件为ArrayBuffer+进度条显示

HTML,同上

JS:

复制代码

  1. var read = {
  2. //初始化绑定
  3. init: function () {
  4. var _this = this;
  5. _this.status = document.getElementById('Status');
  6. _this.progress = document.getElementById('Progress');
  7. _this.percent = document.getElementById('Percent');
  8. document.getElementById('file').onchange = _this.fileHandler;
  9. document.getElementById('abort').onclick = _this.abortHandler;
  10. _this.loaded = 0;
  11. //每次读取1M
  12. //_this.step = 1024 * 1024;
  13. //_this.step = 1024;
  14. _this.step = 1024;
  15. _this.times = 0;
  16. },
  17. //当有选中文件时,事件处理
  18. fileHandler: function (e) {
  19. //读取文件
  20. var _this = read;
  21. //获取上传文件
  22. var file = _this.file = this.files[0];
  23. var reader = _this.reader = new FileReader();
  24. //绑定信息和事件
  25. _this.total = file.size;
  26. reader.onloadstart = _this.onLoadStrart;
  27. reader.onprogress = _this.onProgress;
  28. reader.onabort = _this.onAbort;
  29. reader.onerror = _this.onError;
  30. reader.onload = _this.onLoad;
  31. //reader.onloadend = _this.onLoadEnd;
  32. //从头读取一块
  33. _this.readBlob(0);
  34. $('blockquote').empty();
  35. },
  36. //中断
  37. abortHandler: function (e) {
  38. var _this = read;
  39. if (_this.reader) {
  40. _this.reader.abort();
  41. }
  42. },
  43. //开始读取文件
  44. onLoadStrart: function () { },
  45. //读取过程
  46. onProgress: function (e) {
  47. var _this = read;
  48. //e.loaded 当前读取的数量
  49. //e.total 读取总量
  50. _this.loaded += e.loaded;
  51. //更新进度条
  52. _this.progress.value = (_this.loaded / _this.total) * 100;
  53. },
  54. //中止上传事件
  55. onAbort: function () { },
  56. //当出现异常时
  57. onError: function () { console.log('读取出错'); },
  58. //读取成功 结束
  59. onLoad: function (e) {
  60. var _this = read;
  61. var reader = _this.reader;
  62. // console.info(_this.loaded + '---' + _this.total);
  63. //console.info(reader.result); //ArrayBuffer 数组
  64. //console.info(reader.result.byteLength); //ArrayBuffer 数组 的长度
  65. //转换成 Int8Array 类型
  66. //var b = new Int8Array(reader.result);
  67. //转换成 Int32Arrary 类型
  68. var b = new Int32Array(reader.result);
  69. console.info(b); //ArrayBuffer 数组 的长度
  70. $('blockquote').append(b.toString());
  71. //判断是否已经读到最后,如果没有继续读取
  72. if (_this.loaded < _this.total) {
  73. _this.readBlob(_this.loaded);
  74. } else {
  75. _this.loaded = _this.total;
  76. }
  77. },
  78. //读取结束时 ,每次读取成功结束或调用abord
  79. onLoadEnd: function (e) {
  80. //console.log('读取结束');
  81. },
  82. readBlob: function (start) {
  83. var _this = read;
  84. var blob,
  85. file = _this.file;
  86. _this.times += 1;
  87. console.info('start:' + start);
  88. blob = file.slice(start, start + _this.step);
  89. _this.reader.readAsArrayBuffer(blob);
  90. }
  91. };
  92. read.init();

发表评论

表情:
评论列表 (有 0 条评论,118人围观)

还没有评论,来说两句吧...

相关阅读