javascript - 如何使用 Javascript 确保 FileReader 完全读取文件

标签 javascript html dom file-upload filereader

我在 XML 文件中定义了各种 HTML 元素。 我无法整体显示我的 XML 元素,但它有多行,每行都包含复选框、文件上传选项等。

我使用 Javascript 来获取这些元素,然后使用 XMLHTTPRequest,将这些请求发送到 Controller 进行处理。

想象 HTML 元素如下所示:

Row1 ----  Checkbox1_Row1   TextDescription_Row1     FileUpload_Row1    
Row2 ----  Checkbox1_Row2   TextDescription_Row2     FileUpload_Row2    

我可以有尽可能多的行。

使用 Javascript,我获取所有这些表单元素,并且这些元素按行号(Row1、Row2)进行区分。

我循环遍历每个表单元素,然后

for(var j=0; j< formelements.length; j+++)
{
  if (formElements[j].type == "textbox")
   {
        Do something
    }
    elseif (formElements[j].type == "file")
    {
        var Base64String;
        var ready = false;
        var fileName = formElements[j].files[0].name;

        var check = function () {
        if (ready === true) {               
         array.push(Base64String);                           
         return;
         }
         setTimeout(check, 1000);
         }

         check();

         var reader = new FileReader();
          reader.onloadend = function (evt) {
          Base64String = evt.target.result;
          ready = true;
          };
         reader.readAsDataURL(file);
        }
    }

我正在使用一个数组来推送与每行相对应的所有值,并且具有最终值的数组将在经过一些更改后发送到 Controller 。对于文件上传选项,我从每一行读取文件并将它们转换为二进制格式并发送给 Controller 。如果只有一行,这种方法效果很好。当有多行时,这种方法会发生什么情况,在循环表单元素时,它检查第一行(例如文本框)的所有内容并将其放入数组中,但当它是文件类型时,它会进入循环并读取文件。读取文件在这里需要一些时间,然后时间循环会转到下一个表单元素(除了 Row2 之外什么也没有)。现在 Row2 表单元素出现在图片中并表示,我们不上传任何文件,它将为空。现在 check() 函数已完成,并且 row1 中的文件已完全读取。由于循环已在第 2 行表单元素中,因此除了空值外,该文件值将分配给第 2 行。因此,当涉及文件类型时,Row2 将同时具有空值和文件值,但 Row1 没有值。同样,如果我在多行中有许多文件,则文件值将根据 FileReader 读取的时间分配给当前循环中的任意行表单元素。

我需要确保在转到下一个表单元素之前完全读取文件值。如何实现这一目标?

************************更新************************

这里提到的将我的问题标记为重复的问题只有文件类型进来,因此,他们可以循环遍历文件类型。对我来说,表单元素由 Checkbox1_Row1、TextDescription_Row1、FileUpload_Row1、Checkbox1_Row2、TextDescription_Row2、FileUpload_Row2 组成。

我必须确保 FileUpload_Row1 具有从文件中读取的正确值,然后再转到下一个表单元素(此处为 Checkbox1_Row2)。

最佳答案

evt 应该是 evt.target.result 处的 event.push() event.target.resultfileList 数组,当 fileList .length 时执行操作 等于计数

<!DOCTYPE html>
<html>

<head>
  <script>
    function myFunction() {
      var files = Array.prototype.map.call(
        document.querySelectorAll("[id^=myFile]")
        , function(input) {
            return {id:input.dataset.id, file: input.files[0]};
      });

      var count = files.length; // total number of files
      var fileList = []; // accepted files

      for (var i = 0; i < count; i++) {
        var file = files[i].file;
        var id = files[i].id;
        var filename = files[i].file.name;
        if (i >= count) {
          break;
        }

        var reader = new FileReader();

        reader.onload = (function(id, filename) {
          return function(event) {
            fileList.push({id, filename, file:event.target.result}); {
              if (fileList.length === count) {
                // do stuff with `fileList`
                console.log(fileList);
              }
            }
          }
        })(id, filename);
        reader.readAsDataURL(file);
      }
    }
  </script>
</head>

<body>
  <h1>Hello Plunker!</h1>
  <input type="file" id="myFile_row1" data-id="A">
  <input type="file" id="myFile_row2" data-id="B">
  <input type="file" id="myFile_row3" data-id="C">

  <button onclick="myFunction()">Try it</button>

</body>

</html>

plnkr http://plnkr.co/edit/VCGPPbWcock0PgC9wMWi?p=preview

关于javascript - 如何使用 Javascript 确保 FileReader 完全读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43971178/

相关文章:

javascript - 外星人名字生成器

javascript - WordPress 中无冲突的 jQuery 范围

javascript - Angular Routing 1.6 帮助

javascript - 如何做一个可爱的DIV半径

javascript - Node.js setTimeout 上下文问题

html - 为什么 chrome 和 IE7 中的框架高度不同

PHP htmlentities() 输入与输出

javascript - 获取选定的文本位置并在其旁边放置一个元素

javascript - 刷新页面后如何保存数据

angularjs - Protractor 从 dom 中移除元素