42 lines
1.4 KiB
JavaScript
42 lines
1.4 KiB
JavaScript
// Accept a value from a file input based on a required mimetype
|
|
$.validator.addMethod( "accept", function( value, element, param ) {
|
|
|
|
// Split mime on commas in case we have multiple types we can accept
|
|
var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
|
|
optionalValue = this.optional( element ),
|
|
i, file, regex;
|
|
|
|
// Element is optional
|
|
if ( optionalValue ) {
|
|
return optionalValue;
|
|
}
|
|
|
|
if ( $( element ).attr( "type" ) === "file" ) {
|
|
|
|
// Escape string to be used in the regex
|
|
// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
|
|
// Escape also "/*" as "/.*" as a wildcard
|
|
typeParam = typeParam
|
|
.replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
|
|
.replace( /,/g, "|" )
|
|
.replace( /\/\*/g, "/.*" );
|
|
|
|
// Check if the element has a FileList before checking each file
|
|
if ( element.files && element.files.length ) {
|
|
regex = new RegExp( ".?(" + typeParam + ")$", "i" );
|
|
for ( i = 0; i < element.files.length; i++ ) {
|
|
file = element.files[ i ];
|
|
|
|
// Grab the mimetype from the loaded file, verify it matches
|
|
if ( !file.type.match( regex ) ) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Either return true because we've validated each file, or because the
|
|
// browser does not support element.files and the FileList feature
|
|
return true;
|
|
}, $.validator.format( "Please enter a value with a valid mimetype." ) );
|