首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript - FileReader如何一次读取和处理多个文件中的每个文件

Javascript - FileReader如何一次读取和处理多个文件中的每个文件
EN

Stack Overflow用户
提问于 2018-06-22 07:51:33
回答 1查看 61关注 0票数 0

我试着让用户丢弃多个excel文件,并从每个文件中提取所需的值,并将其上传到网站一次一个文件。

我的代码不工作,我假设这是因为回调问题。

有人能帮上忙吗?

编辑:我还添加了我的uploadFile函数。我非常感谢你的帮助。

代码语言:javascript
复制
for(var i = 0; i < fileList.length; i++) {
            //console.log(fileList[i]["file"]);
            var reader = new FileReader();

            var f = fileList[i]["file"];
            //var fName = fileList[i]["fileName"];
            var excelObject = fileList[i];

            reader.onload = function(ev) {

                var data = ev.target.result;
                if(!rABS) data = new Uint8Array(data);

                var wb = XLSX.read(data, {type: rABS ? 'binary' : 'array'});

                var einAddress = "B3";
                var engCodeAddress = "B1";
                var goAddress = "B2";
                var errMsg = tabName + " tab or required value is missing";

                    // Worksheet with the necessary info
                try{
                    var ws =  wb.Sheets[tabName];
                    var ein_cell = ws[einAddress];
                    ein = (ein_cell ? ein_cell.v.toString() : undefined);

                    var eng_cell = ws[engCodeAddress];
                    engCode = (eng_cell ? eng_cell.v.toString() : undefined);

                    var go_cell = ws[goAddress];
                    goLocator = (go_cell ? go_cell.v.toString() : undefined);

                    if(ein == undefined || engCode == undefined || goLocator == undefined){
                        hasValues = false;
                    }

                    excelObject["EngagementCode"] = engCode;
                    excelObject["GoSystem"] = goLocator;
                    excelObject["EIN"] = ein;

                    if(hasValues && isValid){
                        uploadFile(fileList[i], userInfo);
                    } else {
                        noValueErrorHandler(errMsg);
                    }

                } catch(err){
                    hasValues = false;
                }

            };

            if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);

        } 


function uploadFile(f, userInfo) {

// Define the folder path for this example.
var serverRelativeUrlToFolder = listName;

// Get info of the file to be uploaded
var file = f;
var fileInput = file["file"];
var newName = file["fileName"];
var ein = file["EIN"];
var engCode = file["EngagementCode"];
var email = userInfo;
var goLocator = file["GoSystem"];
console.log("file: " + file);

// Get the server URL.
var serverUrl = _spPageContextInfo.siteAbsoluteUrl + "/StatusTracker";

// Initiate method calls using jQuery promises.
// Get the local file as an array buffer.
var getFile = getFileBuffer(fileInput);
getFile.done(function (arrayBuffer) {

    // Add the file to the SharePoint folder.
    var addFile = addFileToFolder(arrayBuffer, newName);
    addFile.done(function (file, status, xhr) {

        // Get the list item that corresponds to the uploaded file.
        var getItem = getListItem(file.d.ListItemAllFields.__deferred.uri);
        getItem.done(function (listItem, status, xhr) {

            // Change the display name and title of the list item.
            var changeItem = updateListItem(listItem.d.__metadata);
            changeItem.done(function (data, status, xhr) {
                processedCount += 1;
                if (processedCount < fileCount) {

                    uploadFile(fileList[processedCount], email);

                } else if (processedCount == fileCount){
                    $("#dropbox").text("Done, drop your next file");
                    $("#ADMNGrid").data("kendoGrid").dataSource.read();
                    fileList = [];
                    alert("Total of " + processedCount + " items are processed!");
                }



                // Refresh kendo grid and change back the message and empty fileList
                //$("#dropbox").text("Drag your Fund/Lower Tier workpaper here ...");
                //location.reload(true);

            });
            changeItem.fail(onError);
        });
        getItem.fail(onError);
    });
    addFile.fail(onError);
});
getFile.fail(onError);
EN

回答 1

Stack Overflow用户

发布于 2018-06-22 08:00:48

您可以将所有内容放入一个async函数中,并为每次迭代await一个Promise,强制以串行方式处理文件。您没有发布您的uploadFile,但是如果您让它返回一个一旦完成就会解析的Promise,您可以执行以下操作:

代码语言:javascript
复制
async fn() {
  for (var i = 0; i < fileList.length; i++) {
    await new Promise((resolve, reject) => {
      //console.log(fileList[i]["file"]);
      var reader = new FileReader();

      var f = fileList[i]["file"];
      //var fName = fileList[i]["fileName"];
      var excelObject = fileList[i];

      reader.onload = function(ev) {

        var data = ev.target.result;
        if (!rABS) data = new Uint8Array(data);

        var wb = XLSX.read(data, {
          type: rABS ? 'binary' : 'array'
        });

        var einAddress = "B3";
        var engCodeAddress = "B1";
        var goAddress = "B2";
        var errMsg = tabName + " tab or required value is missing";

        // Worksheet with the necessary info
        try {
          var ws = wb.Sheets[tabName];
          var ein_cell = ws[einAddress];
          ein = (ein_cell ? ein_cell.v.toString() : undefined);

          var eng_cell = ws[engCodeAddress];
          engCode = (eng_cell ? eng_cell.v.toString() : undefined);

          var go_cell = ws[goAddress];
          goLocator = (go_cell ? go_cell.v.toString() : undefined);

          if (ein == undefined || engCode == undefined || goLocator == undefined) {
            hasValues = false;
          }

          excelObject["EngagementCode"] = engCode;
          excelObject["GoSystem"] = goLocator;
          excelObject["EIN"] = ein;

          if (hasValues && isValid) {
            uploadFile(fileList[i], userInfo)
              .then(resolve);
          } else {
            noValueErrorHandler(errMsg);
            reject();
          }

        } catch (err) {
          hasValues = false;
          reject();
        }

      };

      if (rABS) reader.readAsBinaryString(f);
      else reader.readAsArrayBuffer(f);
    });
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50978872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档