上传前验证 AngularJs 中的文件扩展名

Validating file extension in AngularJs before uploading

我正在将应用程序的图像上传到服务器。 有什么方法可以在将扩展提交到服务器之前通过 JS 在客户端验证扩展,然后再将它们上传到服务器?

我正在使用 AngularJs 来处理我的前端。

您可以添加一个自定义指令来检查 element.files 数组,以便检查 onchange 事件的类型。 没有针对文件输入的嵌入式验证。

File Upload using AngularJS

有很多模块可以帮助您解决这个问题。这些中的任何一个都应该允许您定义一个过滤器以仅上传某些文件扩展名。

如果您正在寻找更简单的解决方案,您可以使用 string.js 之类的方法来确保上传文件的文件名具有扩展名“.png”。

您可以使用这个简单的 javascript 来验证。此代码应放在指令中,并在更改文件上传控制时使用。

var extn = filename.split(".").pop();

或者您也可以使用 javascript 子字符串方法:

fileName.substr(fileName.lastIndexOf('.')+1)

您可以创建一个 angular 指令,像这样应该可以工作(更改 validFormats 数组中接受的值);

HTML:

    <form name='fileForm' >
        <input type="file" name="file" ng-model="fileForm.file" validfile>
    </form>

Javascript:

angular.module('appname').directive('validfile', function validFile() {

    var validFormats = ['jpg', 'gif'];
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            ctrl.$validators.validFile = function() {
                elem.on('change', function () {
                   var value = elem.val(),
                       ext = value.substring(value.lastIndexOf('.') + 1).toLowerCase();   

                   return validFormats.indexOf(ext) !== -1;
                });
           };
        }
    };
});

用于文件验证,即 需要文件扩展名大小。创建自定义指令和使用 angular js ng-message 模块来简化验证错误

HTML

<input type="file" ng-model="imageFile" name="imageFile" valid-file required>

<div ng-messages="{FORMNAME}.imageFile.$error" ng-if="{FORMNAME}.imageFile.$touched">
     <p ng-message="required">This field is required</p>
     <p ng-message="extension">Invalid Image</p>
 </div>

Angular JS

customApp.directive('validFile', function () {
return {
    require: 'ngModel',
    link: function (scope, elem, attrs, ngModel) {
        var validFormats = ['jpg','jpeg','png'];
        elem.bind('change', function () {
            validImage(false);
            scope.$apply(function () {
                ngModel.$render();
            });
        });
        ngModel.$render = function () {
            ngModel.$setViewValue(elem.val());
        };
        function validImage(bool) {
            ngModel.$setValidity('extension', bool);
        }
        ngModel.$parsers.push(function(value) {
            var ext = value.substr(value.lastIndexOf('.')+1);
            if(ext=='') return;
            if(validFormats.indexOf(ext) == -1){
                return value;
            }
            validImage(true);
            return value;
        });
    }
  };
});

要求 angular-messages.min.js

这是验证文件扩展名的完整代码AngularJs

<!DOCTYPE html>
<html>
<head>
    <title></title>

    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>

    <script type='text/javascript'>
            var myApp = angular.module('myApp', []);
            myApp.controller('MyCtrl', function($scope) {
                $scope.setFile = function(element) {
                    $scope.$apply(function($scope) {
                        $scope.theFile = element.files[0];
                        $scope.FileMessage = '';
                        var filename = $scope.theFile.name;
                        console.log(filename.length)
                        var index = filename.lastIndexOf(".");
                        var strsubstring = filename.substring(index, filename.length);
                        if (strsubstring == '.pdf' || strsubstring == '.doc' || strsubstring == '.xls' || strsubstring == '.png' || strsubstring == '.jpeg' || strsubstring == '.png' || strsubstring == '.gif')
                        {
                          console.log('File Uploaded sucessfully');
                        }
                        else {
                            $scope.theFile = '';
                              $scope.FileMessage = 'please upload correct File Name, File extension should be .pdf, .doc or .xls';
                        }

                    });
                };
            });
    </script>

</head>
<body ng-app="myApp">
    <div ng-controller="MyCtrl">
        <input type="file"
               onchange="angular.element(this).scope().setFile(this)">
        {{theFile.name}}
        {{FileMessage}}
    </div>

</body>
</html>