angularjs多上传文件和解析

时间:2016-01-06 15:00:58

标签: angularjs filereader

我创建了一个带有多个上传csv文件的接口(完成)。

此CSV文件必须使用自定义fileReader服务加载到导航器客户端,该服务使用$ q(已完成),然后使用ngPapaParser(已完成)进行解析并显示在{{1}的视图中1}}(已完成但未在示例中进行简化)。

这是一个显示我有错误的傻瓜:http://plnkr.co/edit/YVvitZ2yfxjJw76n6t9F?p=preview

问题是需要在ngTable承诺中获取文件名,但我不知道如何获取它。

fileReader.readAsText

如何让以下函数返回一个promise和文件?

controller('MainCtrl', function($scope, Papa,fileReader) {

  $scope.parsedResults = [];

   $scope.getFiles = function (files) {
      $scope.parsedResults = [];
      // Loop through the FileList and render image files as thumbnails.
      for (var i = 0, f; f = files[i]; i++) {
          console.log(f.name); // ok her 
          fileReader.readAsText(f, $scope).then(function(resultText) {
              Papa.parse(resultText, {
                  header: true,
                  //   worker: true,
                  skipEmptyLines: true,
                  complete: function(result) {
                      var cols= [];
                      for(var i in result.meta.fields){
                          cols.push({
                              field: result.meta.fields[i] , title: result.meta.fields[i].toLowerCase() , show: true
                          });
                      }
                      console.log(f.name); // undefined her in the callback
                      //I WANT THE FILENAME HER !!! 
                      var io = { 'filename': 'f.name unknow' ,'cols':cols ,'tableParams': result.data  } ;
                      $scope.parsedResults.push(io);
                  }
              });
          });
      }
  };
});

1 个答案:

答案 0 :(得分:1)

试试这个:

var readAsText = function (file, scope) {
   var deferred = $q.defer();
   var reader = getReader(deferred, scope);
   reader.readAsText(file);
   // then will return another promise with content and file available
   return deferred.promise.then(function(result){
        return {
            content: result,
            file: file
        };
   });
};

您可以按如下方式使用它:

readAsText(file, $scope).then(function(result){
    var content = result.content;
    var file = result.file;
    //...
})