web-dev-qa-db-ja.com

アップロード前にAngularJsでファイル拡張子を検証する

アプリケーションの画像をサーバーにアップロードしています。サーバーにアップロードする前にサーバーに送信する前に、JSによってクライアント側の拡張機能を検証する方法はありますか?

AngularJsを使用して、フロントエンドを処理しています。

13
Ali Saberi

この単純なJavaScriptを使用して検証できます。このコードは、ディレクティブ内およびファイルアップロード制御の変更時に配置する必要があります。

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

または、javascript substringメソッドも使用できます。

fileName.substr(fileName.lastIndexOf('.')+1)
23
Sanjeev Singh

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;
                });
           };
        }
    };
});
11
ecarrizo

ファイル検証の場合、つまりrequiredfile extensionsize。カスタムディレクティブを作成し、検証エラーを簡素化するために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;
        });
    }
  };
});

Requireangular-messages.min.js

5
Aniket Muruskar

以下は、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>
1
Shakeer Hussain

onchangeイベントのタイプを確認するために、element.files配列を確認するカスタムディレクティブを追加できます。ファイル入力の検証は組み込まれていません。

AngularJSを使用したファイルのアップロード

これに役立つ多くのモジュールがあります。これらのいずれかを使用すると、特定のファイル拡張子のみをアップロードするフィルターを定義できます。

より簡単なソリューションを探している場合は、 string.js のようなものを使用して、アップロードされるファイルのファイル名が拡張子「.png」であることを確認できます。

0
jcc