2017-07-18 170 views
3

嗨,我正在开发angularjs应用程序。我正在做文件上传模块。我正在尝试验证这些文件。我只想上传xlsx或xls文件。我已经开发了指令和工厂方法来上传文件,如下所示。Angularjs如何获取文件扩展名?

myapp.directive('fileModel', ['fileUploadExcel', function (fileUploadExcel) { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      element.bind("change", function (evt) { 
       fileUploadExcel.pendingFiles[attrs.fileModel] = evt.target.files[0]; 
      }); 
     } 
    }; 
}]); 

下面是我的控制器。

$scope.upload = function (filename) { 
fileUploadExcel.doUpload().success(function (success) { 
}).error(function (error) { 
}); 

下面是我的工厂代码。

myapp.factory('fileUploadExcel', ['$http', '$cookieStore', 'cfg', function ($http, $cookieStore, cfg) { 
    var LoginID = $cookieStore.get("LoginID"); 
    var baseurl = cfg.Baseurl; 
    var fileuploadurl = baseurl + 'api/Customer/BulkUploadVehicle/'; 

    var service = { 
     uploadUrl: fileuploadurl, 
     pendingFiles: {}, 
     doUpload: doUpload 
    }; 
    return service; 
    function doUpload() { 
     var filename; 
     var files = new FormData(); 
     files.append('LoginID', LoginID); 
     angular.forEach(this.pendingFiles, function (value, index) { 
      filename = value.name; 
      files.append(index, value); 
     }); 
     var extn = filename.split(".").pop(); 
     if (extn == 'xlsx' || extn == 'xls') { 
      return $http.post(this.uploadUrl, files, { 
       transformRequest: angular.identity, 
       headers: { 
        'Content-Type': undefined 
       } 
      }) 
     } 
     else 
     { 
      return false; 
     } 
    } 
}]); 

我能够成功获得extn。当我的文件是类型的Excel我的代码工作正常。每当我上传除Excel以外的错误。我写了return false。这在这里不起作用。我应该回到别的可能。我可否知道在其他情况下我应该写些什么?有人可以帮我从这里出去吗?任何帮助,将不胜感激。谢谢。

+0

当您尝试上传除xlsx或xls扩展名以外的文件时究竟发生了什么?它是否通过if条件? –

+0

谢谢拉胡尔。每当我上传除Excel以外,我得到错误fileUploadExcel.doUpload(...)。成功不是一个功能 –

+0

ahh..got it ..检查答案? –

回答

2

你返回不同的类型:

上的成功,你返回$ http诺言在你的工厂,所以你可以打电话成功&错误在你的控制器whith功能:

fileUploadExcel.doUpload().success()存在!

但如果错误,您在工厂返回false,在这种情况下,这是一个布尔值并且不是$ http承诺,所以您不能使用成功&错误函数。

fileUploadExcel.doUpload().success()犯规存在,并返回一个错误

当然的解决办法是检查返回值是不假,继续你的代码,但我建议通过解决,它总是返回一个承诺,如果成功,拒绝它,错误,所以承诺链是一个没有破。

PS:$ HTTP是一种改性的承诺,为什么他们有成功&错误,但我建议使用香草承诺和使用。那么()

var deferred = $q.defer(); 

if (extn === 'xlsx' || extn === 'xls') { 
    $http.post(this.uploadUrl, files, { 
     transformRequest: angular.identity, 
     headers: { 
      'Content-Type': undefined 
     } 
    }).success(function(success) { 
     deferred.resolve(success); 
    }).error(function(error) { 
     deferred.reject(error); 
    }); 
} else { 
    deferred.reject('File format not supported'); 
} 
return deferred.promise; 

和控制器:

$scope.upload = function (filename) { 
    fileUploadExcel.doUpload().then(function (success) { 
     //success 
    }, function (error) { 
     //error 
    }); 
} 
+0

谢谢你的回答。我应该在哪里申报$ q?我得到$ q没有定义 –

+0

$ q应该在您的工厂注入https://docs.angularjs.org/api/ng/service/$q – Fetrarij

+0

是的。谢谢。我不知道q。我经历了异步调用。 –

1

试过这样做呢?

$scope.upload = function (filename) { 
    var promise = fileUploadExcel.doUpload(); //gets promise object in a variable 
    if(promise){ // if variable is not false or null, handle resolution 
    promise.success(function (success) { }).error(function (error) {}); 
    } 
} 

或者你可以在你的工厂返回elsenull,做一个空检查。上面的代码将保持不变。

3

doUpload()返回false时引发错误。由于false是一个布尔值而不是承诺,因此不会定义.success()

,而不是返回false的,我建议你返回一个拒绝承诺时,该文件不是一个Excel的线沿线的文件: return $q.reject("File type not supported: " + extn);

+0

太清楚了,要做到这一点,您需要将'$ q'服务注入'fileUploadExcel'工厂,与您注入'$ http'类似。 –

相关问题