We are currently validating images using magic number. Since SVG doesn't support magic number, what is the good way to validate SVG files in angularJS ?
This is how we are validating other images -
angular.module('fileMimeTypeServiceModule', [])
.constant('fileMimeTypeServiceConstants', {
VALID_IMAGE_MIME_TYPE_CODES: ['FFD8FFDB', 'FFD8FFE0', 'FFD8FFE1', '474946383761', '424D', '49492A00', '4D4D002A', '89504E470D0A1A0A']
})
.factory('seFileReader', function() {
var read = function(file, config) {
var fileReader = new FileReader();
config = config || {};
fileReader.onloadend = config.onLoadEnd;
fileReader.onerror = config.onError;
fileReader.readAsArrayBuffer(file);
return fileReader;
};
return {
read: read
};
})
.factory('fileMimeTypeService', function(fileMimeTypeServiceConstants, seFileReader, $q) {
var _validateMimeTypeFromFile = function(loadedFile) {
var fileAsBytes = (new Uint8Array(loadedFile)).subarray(0, 8);
var header = fileAsBytes.reduce(function(header, byte) {
var byteAsStr = byte.toString(16);
if (byteAsStr.length === 1) {
byteAsStr = '0' + byteAsStr;
}
header += byteAsStr;
return header;
}, '');
return fileMimeTypeServiceConstants.VALID_IMAGE_MIME_TYPE_CODES.some(function(mimeTypeCode) {
return header.toLowerCase().indexOf(mimeTypeCode.toLowerCase()) === 0; // validating here
});
};
var isFileMimeTypeValid = function(file) {
var deferred = $q.defer();
seFileReader.read(file, {
onLoadEnd: function(e) {
if (_validateMimeTypeFromFile(e.target.result)) {
deferred.resolve();
} else {
deferred.reject();
}
},
onError: function() {
deferred.reject();
}
});
return deferred.promise;
};
return {
isFileMimeTypeValid: isFileMimeTypeValid
};
});
Now i want to validate SVG images as well, how can we validate it without magic number ?