1+ /**
2+ * jQuery Form Validator Module: File
3+ * ------------------------------------------
4+ * Created by Victor Jonsson <http://www.victorjonsson.se>
5+ *
6+ * The following validators will be added by this module:
7+ * - mime type
8+ * - file size
9+ * - file extension
10+ *
11+ * @website http://formvalidator.net/
12+ * @license Dual licensed under the MIT or GPL Version 2 licenses
13+ * @version 2.2.beta.50
14+ */
15+ ( function ( $ , window ) {
16+
17+ 'use strict' ;
18+
19+ var SUPPORTS_FILE_READER = typeof window . FileReader != 'undefined' ,
20+
21+ /**
22+ * @return {Array }
23+ */
24+ _getTypes = function ( $input ) {
25+ var allowedTypes = $ . split ( ( $input . valAttr ( 'allowing' ) || '' ) . toLowerCase ( ) ) ;
26+
27+ if ( $ . inArray ( 'jpg' , allowedTypes ) > - 1 && $ . inArray ( 'jpeg' , allowedTypes ) == - 1 )
28+ allowedTypes . push ( 'jpeg' ) ;
29+ else if ( $ . inArray ( 'jpeg' , allowedTypes ) > - 1 && $ . inArray ( 'jpg' , allowedTypes ) == - 1 )
30+ allowedTypes . push ( 'jpg' ) ;
31+ return allowedTypes ;
32+ } ,
33+
34+ /**
35+ * @param {Object } obj
36+ * @param {String } key
37+ * @param {String } insert
38+ * @param {Object } lang
39+ */
40+ _generateErrorMsg = function ( obj , key , insert , lang ) {
41+ var msg = lang [ key ] ;
42+ obj . errorMessageKey = '' ; // only use message attached to this object
43+ obj . errorMessage = msg . replace ( '\%s' , insert ) ;
44+ } ,
45+
46+ /**
47+ * @param {String } msg
48+ */
49+ _log = function ( msg ) {
50+ if ( window . console && window . console . log ) {
51+ window . console . log ( msg ) ;
52+ }
53+ } ;
54+
55+ /*
56+ * Validate mime type (falls back on validate_extension in older browsers)
57+ */
58+ $ . formUtils . addValidator ( {
59+ name : 'mime' ,
60+ validatorFunction : function ( str , $input , conf , language ) {
61+
62+ if ( SUPPORTS_FILE_READER ) {
63+ var valid = true ,
64+ files = $input . get ( 0 ) . files || [ ] ,
65+ mime = '' ,
66+ allowedTypes = _getTypes ( $input ) ;
67+
68+ if ( files . length ) {
69+ $ . each ( files , function ( i , file ) {
70+ valid = false ;
71+ mime = file . type || '' ;
72+ $ . each ( allowedTypes , function ( j , type ) {
73+ valid = mime . indexOf ( type ) > - 1 ;
74+ if ( valid ) {
75+ return false ;
76+ }
77+ } ) ;
78+ return valid ;
79+ } ) ;
80+
81+ if ( ! valid ) {
82+ _log ( 'Trying to upload a file with mime type ' + mime + ' which is not allowed' ) ;
83+ _generateErrorMsg ( this , 'wrongFileType' , allowedTypes . join ( ', ' ) , language ) ;
84+ }
85+ }
86+
87+ return valid ;
88+
89+ } else {
90+ _log ( 'FileReader not supported by browser, will check file extension' ) ;
91+ return $ . formUtils . validators . validate_extension . validatorFunction ( str , $input ) ;
92+ }
93+ } ,
94+ errorMessage : '' ,
95+ errorMessageKey : 'wrongFileType'
96+ } ) ;
97+
98+ /**
99+ * Validate file extension
100+ */
101+ $ . formUtils . addValidator ( {
102+ name : 'extension' ,
103+ validatorFunction : function ( value , $input , conf , language ) {
104+ var valid = true ,
105+ _this = this ,
106+ allowedTypes = _getTypes ( $input ) ;
107+
108+ $ . each ( $input . get ( 0 ) . files || [ value ] , function ( i , file ) {
109+ var val = typeof file == 'string' ? file : ( file . value || file . fileName || file . name ) ,
110+ ext = val . substr ( val . lastIndexOf ( '.' ) + 1 ) ;
111+
112+ if ( $ . inArray ( ext . toLowerCase ( ) , allowedTypes ) == - 1 ) {
113+ valid = false ;
114+ _generateErrorMsg ( _this , 'wrongFileType' , allowedTypes . join ( ', ' ) , language ) ;
115+ return false ;
116+ }
117+ } ) ;
118+ return valid ;
119+ } ,
120+ errorMessage : '' ,
121+ errorMessageKey : 'wrongFileType'
122+ } ) ;
123+
124+ /**
125+ * Validate file size
126+ */
127+ $ . formUtils . addValidator ( {
128+ name : 'size' ,
129+ validatorFunction : function ( val , $input , conf , language ) {
130+ var maxSize = $input . valAttr ( 'max-size' ) ;
131+ if ( ! maxSize ) {
132+ _log ( 'Input "' + $input . attr ( 'name' ) + '" is missing data-validation-max-size attribute' ) ;
133+ return true ;
134+ } else if ( ! SUPPORTS_FILE_READER ) {
135+ return true ; // no fallback available
136+ }
137+
138+ var maxBytes = $ . formUtils . convertSizeNameToBytes ( maxSize ) ,
139+ valid = true ;
140+
141+ $ . each ( $input . get ( 0 ) . files || [ ] , function ( i , file ) {
142+ valid = file . size <= maxBytes ;
143+ return valid ;
144+ } ) ;
145+
146+ if ( ! valid ) {
147+ _generateErrorMsg ( this , 'wrongFileSize' , maxSize , language ) ;
148+ }
149+ return valid ;
150+ } ,
151+ errorMessage : '' ,
152+ errorMessageKey : 'wrongFileSize'
153+ } ) ;
154+
155+ /**
156+ * Make this function accessible via formUtils for unit tests
157+ * @param {String } sizeName
158+ * @return {Number }
159+ */
160+ $ . formUtils . convertSizeNameToBytes = function ( sizeName ) {
161+ sizeName = sizeName . toUpperCase ( ) ;
162+ if ( sizeName . substr ( sizeName . length - 1 , 1 ) == 'M' ) {
163+ return parseInt ( sizeName . substr ( 0 , sizeName . length - 1 ) , 10 ) * 1024 * 1024 ;
164+ } else if ( sizeName . substr ( sizeName . length - 2 , 2 ) == 'MB' ) {
165+ return parseInt ( sizeName . substr ( 0 , sizeName . length - 2 ) , 10 ) * 1024 * 1024 ;
166+ } else if ( sizeName . substr ( sizeName . length - 2 , 2 ) == 'KB' ) {
167+ return parseInt ( sizeName . substr ( 0 , sizeName . length - 2 ) , 10 ) * 1024 ;
168+ } else if ( sizeName . substr ( sizeName . length - 1 , 1 ) == 'B' ) {
169+ return parseInt ( sizeName . substr ( 0 , sizeName . length - 1 ) , 10 ) ;
170+ } else {
171+ return parseInt ( sizeName , 10 ) ;
172+ }
173+ } ;
174+
175+ /*
176+ * This event listener will remove error messages for file
177+ * inputs when file changes
178+ */
179+ $ ( window ) . one ( 'validatorsLoaded formValidationSetup' , function ( evt , $form ) {
180+ var $inputs ;
181+ if ( $form ) {
182+ $inputs = $form . find ( 'input[type="file"]' ) ;
183+ } else {
184+ $inputs = $ ( 'input[type="file"]' ) ;
185+ }
186+
187+ $inputs . filter ( '*[data-validation]' ) . bind ( 'change' , function ( ) {
188+ $ ( this )
189+ . removeClass ( 'error' )
190+ . parent ( )
191+ . find ( '.form-error' ) . remove ( ) ;
192+ } ) ;
193+ } ) ;
194+
195+ } ) ( jQuery , window ) ;
0 commit comments