Angularjs如何获取文件扩展名?
嗨,我正在开发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。这在这里不起作用。我应该回到别的可能。我可否知道在其他情况下我应该写些什么?有人可以帮我从这里出去吗?任何帮助,将不胜感激。谢谢。
你返回不同的类型:
上的成功,你返回$ 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
});
}
谢谢你的回答。我应该在哪里申报$ q?我得到$ q没有定义 –
$ q应该在您的工厂注入https://docs.angularjs.org/api/ng/service/$q – Fetrarij
是的。谢谢。我不知道q。我经历了异步调用。 –
试过这样做呢?
$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) {});
}
}
或者你可以在你的工厂返回else
null
,做一个空检查。上面的代码将保持不变。
当doUpload()
返回false
时引发错误。由于false
是一个布尔值而不是承诺,因此不会定义.success()
。
,而不是返回false
的,我建议你返回一个拒绝承诺时,该文件不是一个Excel的线沿线的文件: return $q.reject("File type not supported: " + extn);
太清楚了,要做到这一点,您需要将'$ q'服务注入'fileUploadExcel'工厂,与您注入'$ http'类似。 –
当您尝试上传除xlsx或xls扩展名以外的文件时究竟发生了什么?它是否通过if条件? –
谢谢拉胡尔。每当我上传除Excel以外,我得到错误fileUploadExcel.doUpload(...)。成功不是一个功能 –
ahh..got it ..检查答案? –