HTML5——读取文件FileReader对象上传文件

谁借莪1个温暖的怀抱¢ 2022-05-11 08:26 522阅读 0赞
  1. 方法:

(1)abort()方法:终止读取

(2)readAsText(file,[encoding])方法:将文件读取为文本

(3)readAsBinaryString(file)方法:将文件读取为二进制编码

(4)readAsDataURL(file)方法:将文件读取为DataURL编码

(5)readAsArrayBuffer(file)方法:将文件读取为arraybuffer,传给后台,需要接口

  1. 事件

(1)onloadstart事件:读取开始时触发

(2)onprogress事件:读取中触发

(3)onloadend事件:读取完成时触发,无论成功还是失败

(4)onload事件:文件读取完成时触发

(5)onabort事件:中断时触发

(6)onerror事件:出错时触发

读取完成后的结果要传给后台,如何获取读取结果:

result属性是读取的结果,然后将获取的结果通过ajax发送给后台

实例:将文件拖拽进浏览器,并上传到后端

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. #drop_area{
  8. width: 300px;
  9. height: 200px;
  10. background: orange;
  11. }
  12. #progress{
  13. display: inline-block;
  14. margin-top: 10px;
  15. border-radius: 15px;
  16. width: 200px;
  17. height: 20px;
  18. border: 1px solid #888;
  19. overflow: hidden;
  20. }
  21. #val{
  22. width: 0;
  23. height: 20px;
  24. background: #ccc;
  25. border-radius: 15px;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <!-- <button id="paused">暂停</button> -->
  31. <div id="drop_area">将图片拖拽到此区域</div>
  32. <div id="progress">
  33. <div id="val"></div>
  34. </div>
  35. <span id="num">0%</span>
  36. <div id="preview"></div>
  37. <script src="./loadFile.js"></script>
  38. <script src="./ajax.js"></script>
  39. <script>
  40. var events = {
  41. load: function (data) {
  42. console.log(data);
  43. ajax('post', 'http://localhost/HTML5/drag/drag-fileReader/upload.php', cb, data, true);
  44. },
  45. progress: function (percent) {
  46. val.style.width = percent * 2 + 'px';
  47. num.innerHTML = Math.round(percent)+ '%';
  48. },
  49. success: function () {
  50. console.log('success');
  51. }
  52. };
  53. function cb() {
  54. console.log('ss')
  55. }
  56. drop_area.addEventListener('dragover', function(e) {
  57. e.preventDefault();
  58. })
  59. var loader;
  60. drop_area.addEventListener('drop', function(e) {
  61. e.preventDefault();
  62. var file = e.dataTransfer.files[0];
  63. loader = new FileLoader(file, events);
  64. })
  65. // document.getElementById('paused').onclick = function () {
  66. // loader.abort();
  67. // }
  68. </script>
  69. </body>
  70. </html>
  71. /*
  72. * 文件读取模块
  73. * file 文件对象
  74. * events 事件回掉对象 包含 success , load, progress
  75. */
  76. var FileLoader = function (file, events) {
  77. this.reader = new FileReader();
  78. this.file = file;
  79. this.loaded = 0;
  80. this.total = file.size;
  81. //每次读取1M
  82. this.step = 1024 * 1024;
  83. this.events = events || {};
  84. //读取第一块
  85. this.readBlob(0);
  86. this.bindEvent();
  87. }
  88. FileLoader.prototype = {
  89. bindEvent: function (events) {
  90. var _this = this,
  91. reader = this.reader;
  92. reader.onload = function (e) {
  93. _this.onLoad();
  94. };
  95. reader.onprogress = function (e) {
  96. _this.onProgress(e.loaded);
  97. };
  98. // start 、abort、error 回调暂时不加
  99. },
  100. // progress 事件回掉
  101. onProgress: function (loaded) {
  102. var percent,
  103. handler = this.events.progress;
  104. this.loaded += loaded;
  105. percent = (this.loaded / this.total) * 100;
  106. handler && handler(percent);
  107. },
  108. // 读取结束(每一次执行read结束时调用,并非整体)
  109. onLoad: function () {
  110. var handler = this.events.load;
  111. // 应该在这里发送读取的数据
  112. handler && handler(this.reader.result);
  113. // 如果未读取完毕继续读取
  114. if (this.loaded < this.total) {
  115. this.readBlob(this.loaded);
  116. } else {
  117. // 读取完毕
  118. this.loaded = this.total;
  119. // 如果有success回掉则执行
  120. this.events.success && this.events.success();
  121. }
  122. },
  123. // 读取文件内容
  124. readBlob: function (start) {
  125. var blob,
  126. file = this.file;
  127. // 如果支持 slice 方法,那么分步读取,不支持的话一次读取
  128. if (file.slice) {
  129. blob = file.slice(start, start + this.step);
  130. } else {
  131. blob = file;
  132. }
  133. this.reader.readAsText(blob);
  134. },
  135. // 中止读取
  136. abort: function () {
  137. var reader = this.reader;
  138. if(reader) {
  139. reader.abort();
  140. }
  141. }
  142. }
  143. function ajax(method, url, callback, data, flag) {
  144. var xhr = null;
  145. if(window.XMLHttpRequest) {
  146. xhr = new XMLHttpRequest();
  147. }else {
  148. xhr = new ActiveXObject('Microsoft.XMLHttp')
  149. }
  150. xhr.onreadystatechange = function() {
  151. if(xhr.readyState == 4) {
  152. if(xhr.status == 200) {
  153. callback(xhr.responseText);
  154. }else {
  155. console.log('error');
  156. }
  157. }
  158. }
  159. method = method.toUpperCase();
  160. if(method == 'GET') {
  161. var date = new Date(),
  162. timer = date.getTime();
  163. xhr.open(method, url + '?' + data + '&timer=' + timer, flag);
  164. xhr.send();
  165. }else if(method == 'POST') {
  166. xhr.open(method, url, flag);
  167. xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  168. xhr.send(data);
  169. }
  170. }
  171. <?php
  172. $mypic = $_FILES["mypic"];
  173. if(!empty($mypic)){
  174. $picname = $_FILES['mypic']['name'];
  175. $picsize = $_FILES['mypic']['size'];
  176. if ($picsize > 512000) {
  177. echo '图片大小不能超过500k';
  178. exit;
  179. }
  180. $type = strstr($picname, '.');
  181. // if ($type != ".gif" && $type != ".jpg") {
  182. // echo '图片格式不对!';
  183. // exit;
  184. // }
  185. $pics = 'helloweba' . $type;
  186. //上传路径
  187. $pic_path = "pics/". $pics;
  188. move_uploaded_file($mypic["tmp_name"],$pic_path);
  189. }
  190. ?>

70

出现问题:打印出的data值是文件的内容,但是中文内容乱码,而英文正常。

load: function (data) {

console.log(data);

ajax(‘post’, ‘http://localhost/HTML5/drag/drag-fileReader/upload.php‘, cb, data, true);

},

70 1

实例:点击上传文件,浏览器获得文件信息,并没有上传到后端功能

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <form>
  9. <fieldset>
  10. <legend>分步读取文件:</legend>
  11. <!-- type类型是file即可获取本地文件 -->
  12. <input type="file" id="File">
  13. <input type="button" value="中断" id="Abort">
  14. <p>
  15. <lable>读取进度:</lable>
  16. <progress id="Progress" value="0" max="100"></progress>
  17. </p>
  18. </fieldset>
  19. </form>
  20. <script src="./loadFile.js"></script>
  21. <script>
  22. var progress = document.getElementById('Progress');
  23. var events = {
  24. load: function () {
  25. console.log('loaded');
  26. },
  27. progress: function (percent) {
  28. progress.value = percent;
  29. },
  30. success: function () {
  31. console.log('success');
  32. }
  33. };
  34. var loader;
  35. // 选择好要上传的文件后触发onchange事件,注意文件发生改变会触发该事件
  36. document.getElementById('File').onchange = function (e) {
  37. var file = this.files[0];
  38. console.log(file)
  39. //loadFile.js
  40. loader = new FileLoader(file, events);
  41. };
  42. document.getElementById('Abort').onclick = function () {
  43. loader.abort();
  44. }
  45. </script>
  46. </body>
  47. </html>
  48. /*
  49. * 文件读取模块
  50. * file 文件对象
  51. * events 事件回掉对象 包含 success , load, progress
  52. */
  53. var FileLoader = function (file, events) {
  54. this.reader = new FileReader();
  55. this.file = file;
  56. this.loaded = 0;
  57. this.total = file.size;
  58. //每次读取1M
  59. this.step = 1024 * 1024;
  60. this.events = events || {};
  61. //读取第一块
  62. this.readBlob(0);
  63. this.bindEvent();
  64. }
  65. FileLoader.prototype = {
  66. bindEvent: function (events) {
  67. var _this = this,
  68. reader = this.reader;
  69. reader.onload = function (e) {
  70. _this.onLoad();
  71. };
  72. reader.onprogress = function (e) {
  73. _this.onProgress(e.loaded);
  74. };
  75. // start 、abort、error 回调暂时不加
  76. },
  77. // progress 事件回掉
  78. onProgress: function (loaded) {
  79. var percent,
  80. handler = this.events.progress;
  81. this.loaded += loaded;
  82. percent = (this.loaded / this.total) * 100;
  83. handler && handler(percent);
  84. },
  85. // 读取结束(每一次执行read结束时调用,并非整体)
  86. onLoad: function () {
  87. var handler = this.events.load;
  88. // 应该在这里发送读取的数据
  89. handler && handler(this.reader.result);
  90. // 如果未读取完毕继续读取
  91. if (this.loaded < this.total) {
  92. this.readBlob(this.loaded);
  93. } else {
  94. // 读取完毕
  95. this.loaded = this.total;
  96. // 如果有success回掉则执行
  97. this.events.success && this.events.success();
  98. }
  99. },
  100. // 读取文件内容
  101. readBlob: function (start) {
  102. var blob,
  103. file = this.file;
  104. // 如果支持 slice 方法,那么分步读取,不支持的话一次读取
  105. if (file.slice) {
  106. blob = file.slice(start, start + this.step);
  107. } else {
  108. blob = file;
  109. }
  110. this.reader.readAsText(blob);
  111. },
  112. // 中止读取
  113. abort: function () {
  114. var reader = this.reader;
  115. if(reader) {
  116. reader.abort();
  117. }
  118. }
  119. }

70 2

注意:下面几个标签的用法

70 3

70 4

发表评论

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

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

相关阅读