Angularjs 如何获取文件扩展名?
Angularjs how to get filename extension?
您好,我正在开发 angularjs 应用程序。我正在做文件上传模块。我正在尝试验证文件。我只想上传 xlsx 或 xls 文件。我开发了如下指令和工厂方法来上传文件。
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 错误。这在这里不起作用。我应该 return 其他可能。我可以知道在其他情况下我应该写什么吗?有人可以帮我从这里出去吗?任何帮助,将不胜感激。谢谢你。
试过这样做吗?
$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) {});
}
}
或者您可以 return null
in else
在您的工厂中进行空检查。上面的代码将保持不变。
当doUpload()
returns false
时抛出错误。由于 false
是布尔值而不是承诺,因此 .success()
不会被定义。
我建议你 return 当文件不是 excel 文件时拒绝承诺,而不是 returning false
:
return $q.reject("File type not supported: " + extn);
你return不同类型:
成功后,您在工厂中 return 一个 $http 承诺,因此您可以在控制器中调用成功和错误函数:
fileUploadExcel.doUpload().success()
存在!
但是如果出错,你在你的工厂中 return false,在这种情况下这是一个布尔值,而不是 $http 承诺,所以你不能使用成功和错误函数。
fileUploadExcel.doUpload().success()
不存在并且return一个错误
当然,一个解决方案是检查 returning 值是否不为 false 并继续你的代码,但我建议 return 总是一个承诺,如果成功则解决它并拒绝它错误,因此承诺链没有损坏。
PS:$http 是一个修改后的承诺,为什么他们会成功和出错,但我建议使用原始承诺并使用 .then()
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
});
}
您好,我正在开发 angularjs 应用程序。我正在做文件上传模块。我正在尝试验证文件。我只想上传 xlsx 或 xls 文件。我开发了如下指令和工厂方法来上传文件。
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 错误。这在这里不起作用。我应该 return 其他可能。我可以知道在其他情况下我应该写什么吗?有人可以帮我从这里出去吗?任何帮助,将不胜感激。谢谢你。
试过这样做吗?
$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) {});
}
}
或者您可以 return null
in else
在您的工厂中进行空检查。上面的代码将保持不变。
当doUpload()
returns false
时抛出错误。由于 false
是布尔值而不是承诺,因此 .success()
不会被定义。
我建议你 return 当文件不是 excel 文件时拒绝承诺,而不是 returning false
:
return $q.reject("File type not supported: " + extn);
你return不同类型:
成功后,您在工厂中 return 一个 $http 承诺,因此您可以在控制器中调用成功和错误函数:
fileUploadExcel.doUpload().success()
存在!
但是如果出错,你在你的工厂中 return false,在这种情况下这是一个布尔值,而不是 $http 承诺,所以你不能使用成功和错误函数。
fileUploadExcel.doUpload().success()
不存在并且return一个错误
当然,一个解决方案是检查 returning 值是否不为 false 并继续你的代码,但我建议 return 总是一个承诺,如果成功则解决它并拒绝它错误,因此承诺链没有损坏。
PS:$http 是一个修改后的承诺,为什么他们会成功和出错,但我建议使用原始承诺并使用 .then()
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
});
}