Skip to content

Instantly share code, notes, and snippets.

@ilkou
Created September 14, 2021 19:14
Show Gist options
  • Save ilkou/18392ebd8bfcad44aa98d1bf6cdec405 to your computer and use it in GitHub Desktop.
Save ilkou/18392ebd8bfcad44aa98d1bf6cdec405 to your computer and use it in GitHub Desktop.
Validation of files
export const isValidFile = async (file: File) => {
const contentBuffer = await readFileAsync(file);
if (!(window.FileReader && window.Blob)) {
console.error('FileReader && Blob are not supported');
}
let header = '';
const arr = new Uint8Array(contentBuffer).subarray(0, 4);
for (let i = 0; i < arr.length; i += 1) {
header += arr[i].toString(16);
}
return MIMES.find(({ signs }) =>
signs.find(
(sign) => sign.substring(0, 8).toUpperCase() === header.toUpperCase(),
),
);
};
export const readFileAsync = (file: File) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
resolve(reader.result);
};
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
export const MIMES = [
{
ext: '123',
signs: ['00001A00051004'],
mime: 'application/vnd.lotus-1-2-3',
},
{
ext: 'cpl',
signs: ['4D5A', 'DCDC'],
mime: 'application/cpl+xml',
},
{
ext: 'epub',
signs: ['504B03040A000200'],
mime: 'application/epub+zip',
},
{
ext: 'ttf',
signs: ['0001000000'],
mime: 'application/font-sfnt',
},
{
ext: 'gz',
signs: ['1F8B08'],
mime: 'application/gzip',
},
{
ext: 'tgz',
signs: ['1F8B08'],
mime: 'application/gzip',
},
{
ext: 'hqx',
signs: [
'28546869732066696C65206D75737420626520636F6E76657274656420776974682042696E48657820',
],
mime: 'application/mac-binhex40',
},
{
ext: 'doc',
signs: [
'0D444F43',
'CF11E0A1B11AE100',
'D0CF11E0A1B11AE1',
'DBA52D00',
'2,ECA5C100',
],
mime: 'application/msword',
},
{
ext: 'mxf',
signs: ['060E2B34020501010D0102010102', '3C435472616E7354696D656C696E653E'],
mime: 'application/mxf',
},
{
ext: 'lha',
signs: ['2D6C68'],
mime: 'application/octet-stream',
},
{
ext: 'lzh',
signs: ['2D6C68'],
mime: 'application/octet-stream',
},
{
ext: 'exe',
signs: ['4D5A'],
mime: 'application/octet-stream',
},
{
ext: 'class',
signs: ['CAFEBABE'],
mime: 'application/octet-stream',
},
{
ext: 'dll',
signs: ['4D5A'],
mime: 'application/octet-stream',
},
{
ext: 'img',
signs: [
'000100005374616E64617264204A6574204442',
'504943540008',
'514649FB',
'53434D49',
'7E742C015070024D52010000000800000001000031000000310000004301FF0001000800010000007e742c01',
'EB3C902A',
],
mime: 'application/octet-stream',
},
{
ext: 'iso',
signs: ['769,4344303031', '817,4344303031', '865,4344303031'],
mime: 'application/octet-stream',
},
{
ext: 'ogx',
signs: ['4F67675300020000000000000000'],
mime: 'application/ogg',
},
{
ext: 'oxps',
signs: ['504B0304'],
mime: 'application/oxps',
},
{
ext: 'pdf',
signs: ['25504446'],
mime: 'application/pdf',
},
{
ext: 'p10',
signs: ['64000000'],
mime: 'application/pkcs10',
},
{
ext: 'pls',
signs: ['5B706C61796C6973745D'],
mime: 'application/pls+xml',
},
{
ext: 'eps',
signs: ['252150532D41646F62652D332E3020455053462D332030', 'C5D0D3C6'],
mime: 'application/postscript',
},
{
ext: 'ai',
signs: ['25504446'],
mime: 'application/postscript',
},
{
ext: 'rtf',
signs: ['7B5C72746631'],
mime: 'application/rtf',
},
{
ext: 'tsa',
signs: ['47'],
mime: 'application/tamp-sequence-adjust',
},
{
ext: 'msf',
signs: ['2F2F203C212D2D203C6D64623A6D6F726B3A7A'],
mime: 'application/vnd.epson.msf',
},
{
ext: 'fdf',
signs: ['25504446'],
mime: 'application/vnd.fdf',
},
{
ext: 'fm',
signs: ['3C4D616B657246696C6520'],
mime: 'application/vnd.framemaker',
},
{
ext: 'kmz',
signs: ['504B0304'],
mime: 'application/vnd.google-earth.kmz',
},
{
ext: 'tpl',
signs: ['0020AF30', '6D7346696C7465724C697374'],
mime: 'application/vnd.groove-tool-template',
},
{
ext: 'kwd',
signs: ['504B0304'],
mime: 'application/vnd.kde.kword',
},
{
ext: 'wk4',
signs: ['00001A000210040000000000'],
mime: 'application/vnd.lotus-1-2-3',
},
{
ext: 'wk3',
signs: ['00001A000010040000000000'],
mime: 'application/vnd.lotus-1-2-3',
},
{
ext: 'wk1',
signs: ['0000020006040600080000000000'],
mime: 'application/vnd.lotus-1-2-3',
},
{
ext: 'apr',
signs: ['D0CF11E0A1B11AE1'],
mime: 'application/vnd.lotus-approach',
},
{
ext: 'nsf',
signs: ['1A0000040000', '4E45534D1A01'],
mime: 'application/vnd.lotus-notes',
},
{
ext: 'ntf',
signs: [
'1A0000',
'30314F52444E414E43452053555256455920202020202020',
'4E49544630',
],
mime: 'application/vnd.lotus-notes',
},
{
ext: 'org',
signs: ['414F4C564D313030'],
mime: 'application/vnd.lotus-organizer',
},
{
ext: 'lwp',
signs: ['576F726450726F'],
mime: 'application/vnd.lotus-wordpro',
},
{
ext: 'sam',
signs: ['5B50686F6E655D'],
mime: 'application/vnd.lotus-wordpro',
},
{
ext: 'mif',
signs: ['3C4D616B657246696C6520', '56657273696F6E20'],
mime: 'application/vnd.mif',
},
{
ext: 'xul',
signs: ['3C3F786D6C2076657273696F6E3D22312E30223F3E'],
mime: 'application/vnd.mozilla.xul+xml',
},
{
ext: 'asf',
signs: ['3026B2758E66CF11A6D900AA0062CE6C'],
mime: 'application/vnd.ms-asf',
},
{
ext: 'cab',
signs: ['49536328', '4D534346'],
mime: 'application/vnd.ms-cab-compressed',
},
{
ext: 'xls',
signs: [
'2,0908100000060500',
'D0CF11E0A1B11AE1',
'2,FDFFFFFF04',
'2,FDFFFFFF20000000',
],
mime: 'application/vnd.ms-excel',
},
{
ext: 'xla',
signs: ['D0CF11E0A1B11AE1'],
mime: 'application/vnd.ms-excel',
},
{
ext: 'chm',
signs: ['49545346'],
mime: 'application/vnd.ms-htmlhelp',
},
{
ext: 'ppt',
signs: [
'2,006E1EF0',
'2,0F00E803',
'2,A0461DF0',
'D0CF11E0A1B11AE1',
'2,FDFFFFFF04',
],
mime: 'application/vnd.ms-powerpoint',
},
{
ext: 'pps',
signs: ['D0CF11E0A1B11AE1'],
mime: 'application/vnd.ms-powerpoint',
},
{
ext: 'wks',
signs: ['0E574B53', 'FF000200040405540200'],
mime: 'application/vnd.ms-works',
},
{
ext: 'wpl',
signs: [
',4D6963726F736F66742057696E646F7773204D6564696120506C61796572202D2D20',
],
mime: 'application/vnd.ms-wpl',
},
{
ext: 'xps',
signs: ['504B0304'],
mime: 'application/vnd.ms-xpsdocument',
},
{
ext: 'cif',
signs: ['5B56657273696F6E'],
mime: 'application/vnd.multiad.creator.cif',
},
{
ext: 'odp',
signs: ['504B0304'],
mime: 'application/vnd.oasis.opendocument.presentation',
},
{
ext: 'odt',
signs: ['504B0304'],
mime: 'application/vnd.oasis.opendocument.text',
},
{
ext: 'ott',
signs: ['504B0304'],
mime: 'application/vnd.oasis.opendocument.text-template',
},
{
ext: 'pptx',
signs: ['504B030414000600'],
mime:
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
},
{
ext: 'xlsx',
signs: ['504B030414000600'],
mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
},
{
ext: 'docx',
signs: ['504B030414000600'],
mime:
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
},
{
ext: 'prc',
signs: ['424F4F4B4D4F4249', ',74424D504B6E5772'],
mime: 'application/vnd.palm',
},
{
ext: 'pdb',
signs: [
',000000000000000000000000000000000000000000000000',
'4D2D5720506F636B6574204469637469',
'4D6963726F736F667420432F432B2B20',
'736D5F',
'737A657A',
'ACED0005737200126267626C69747A2E',
],
mime: 'application/vnd.palm',
},
{
ext: 'qxd',
signs: ['00004D4D585052'],
mime: 'application/vnd.Quark.QuarkXPress',
},
{
ext: 'rar',
signs: ['526172211A0700', '526172211A070100'],
mime: 'application/vnd.rar',
},
{
ext: 'mmf',
signs: ['4D4D4D440000'],
mime: 'application/vnd.smaf',
},
{
ext: 'cap',
signs: ['52545353', '58435000'],
mime: 'application/vnd.tcpdump.pcap',
},
{
ext: 'dmp',
signs: ['4D444D5093A7', '5041474544553634', '5041474544554D50'],
mime: 'application/vnd.tcpdump.pcap',
},
{
ext: 'wpd',
signs: ['FF575043'],
mime: 'application/vnd.wordperfect',
},
{
ext: 'xar',
signs: ['78617221'],
mime: 'application/vnd.xara',
},
{
ext: 'spf',
signs: ['5350464900'],
mime: 'application/vnd.yamaha.smaf-phrase',
},
{
ext: 'dtd',
signs: ['0764743264647464'],
mime: 'application/xml-dtd',
},
{
ext: 'zip',
signs: [
'504B0304',
'504B0304',
'504B030414000100630000000000',
'504B0708',
',504B4C495445',
'6,504B537058',
'152,57696E5A6970',
],
mime: 'application/zip',
},
{
ext: 'amr',
signs: ['2321414D52'],
mime: 'audio/AMR',
},
{
ext: 'au',
signs: ['2E736E64', '646E732E'],
mime: 'audio/basic',
},
{
ext: 'm4a',
signs: ['00000020667479704D344120', '667479704D344120'],
mime: 'audio/mp4',
},
{
ext: 'mp3',
signs: ['494433', 'FFFB'],
mime: 'audio/mpeg',
},
{
ext: 'oga',
signs: ['4F67675300020000000000000000'],
mime: 'audio/ogg',
},
{
ext: 'ogg',
signs: ['4F67675300020000000000000000'],
mime: 'audio/ogg',
},
{
ext: 'qcp',
signs: ['52494646'],
mime: 'audio/qcelp',
},
{
ext: 'koz',
signs: ['49443303000000'],
mime: 'audio/vnd.audikoz',
},
{
ext: 'bmp',
signs: ['424D'],
mime: 'image/bmp',
},
{
ext: 'dib',
signs: ['424D'],
mime: 'image/bmp',
},
{
ext: 'emf',
signs: ['01000000'],
mime: 'image/emf',
},
{
ext: 'fits',
signs: ['53494D504C4520203D202020202020202020202020202020202020202054'],
mime: 'image/fits',
},
{
ext: 'gif',
signs: ['474946383961'],
mime: 'image/gif',
},
{
ext: 'jp2',
signs: ['0000000C6A5020200D0A'],
mime: 'image/jp2',
},
{
ext: 'jpg',
signs: ['FFD8', 'FFD8', 'FFD8', 'FFD8'],
mime: 'image/jpeg',
},
{
ext: 'jpeg',
signs: ['FFD8', 'FFD8'],
mime: 'image/jpeg',
},
{
ext: 'jpe',
signs: ['FFD8', 'FFD8'],
mime: 'image/jpeg',
},
{
ext: 'jfif',
signs: ['FFD8'],
mime: 'image/jpeg',
},
{
ext: 'png',
signs: ['89504E470D0A1A0A'],
mime: 'image/png',
},
{
ext: 'tiff',
signs: ['492049', '49492A00', '4D4D002A', '4D4D002B'],
mime: 'image/tiff',
},
{
ext: 'tif',
signs: ['492049', '49492A00', '4D4D002A', '4D4D002B'],
mime: 'image/tiff',
},
{
ext: 'psd',
signs: ['38425053'],
mime: 'image/vnd.adobe.photoshop',
},
{
ext: 'dwg',
signs: ['41433130'],
mime: 'image/vnd.dwg',
},
{
ext: 'ico',
signs: ['00000100'],
mime: 'image/vnd.microsoft.icon',
},
{
ext: 'mdi',
signs: ['4550'],
mime: 'image/vnd.ms-modi',
},
{
ext: 'hdr',
signs: ['233F52414449414E43450A', '49536328'],
mime: 'image/vnd.radiance',
},
{
ext: 'pcx',
signs: ['2,0908100000060500'],
mime: 'image/vnd.zbrush.pcx',
},
{
ext: 'wmf',
signs: ['010009000003', 'D7CDC69A'],
mime: 'image/wmf',
},
{
ext: 'eml',
signs: ['46726F6D3A20', '52657475726E2D506174683A20', '582D'],
mime: 'message/rfc822',
},
{
ext: 'art',
signs: ['4A47040E'],
mime: 'message/rfc822',
},
{
ext: 'manifest',
signs: ['3C3F786D6C2076657273696F6E3D'],
mime: 'text/cache-manifest',
},
{
ext: 'log',
signs: ['2A2A2A2020496E7374616C6C6174696F6E205374617274656420'],
mime: 'text/plain',
},
{
ext: 'tsv',
signs: ['47'],
mime: 'text/tab-separated-values',
},
{
ext: 'vcf',
signs: ['424547494E3A56434152440D0A'],
mime: 'text/vcard',
},
{
ext: 'dms',
signs: ['444D5321'],
mime: 'text/vnd.DMClientScript',
},
{
ext: 'dot',
signs: ['D0CF11E0A1B11AE1'],
mime: 'text/vnd.graphviz',
},
{
ext: 'ts',
signs: ['47'],
mime: 'text/vnd.trolltech.linguist',
},
{
ext: '3gp',
signs: ['0000001466747970336770', '0000002066747970336770'],
mime: 'video/3gpp',
},
{
ext: '3g2',
signs: ['0000001466747970336770', '0000002066747970336770'],
mime: 'video/3gpp2',
},
{
ext: 'mp4',
signs: [
'000000146674797069736F6D',
'000000186674797033677035',
'0000001C667479704D534E56012900464D534E566D703432',
'6674797033677035',
'667479704D534E56',
'6674797069736F6D',
],
mime: 'video/mp4',
},
{
ext: 'm4v',
signs: [
'00000018667479706D703432',
'00000020667479704D345620',
'667479706D703432',
],
mime: 'video/mp4',
},
{
ext: 'mpeg',
signs: ['00000100', 'FFD8'],
mime: 'video/mpeg',
},
{
ext: 'mpg',
signs: ['00000100', '000001BA', 'FFD8'],
mime: 'video/mpeg',
},
{
ext: 'ogv',
signs: ['4F67675300020000000000000000'],
mime: 'video/ogg',
},
{
ext: 'mov',
signs: ['00', '000000146674797071742020', '6674797071742020', '6D6F6F76'],
mime: 'video/quicktime',
},
{
ext: 'cpt',
signs: ['4350543746494C45', '43505446494C45'],
mime: 'application/mac-compactpro',
},
{
ext: 'sxc',
signs: ['504B0304', '504B0304'],
mime: 'application/vnd.sun.xml.calc',
},
{
ext: 'sxd',
signs: ['504B0304'],
mime: 'application/vnd.sun.xml.draw',
},
{
ext: 'sxi',
signs: ['504B0304'],
mime: 'application/vnd.sun.xml.impress',
},
{
ext: 'sxw',
signs: ['504B0304'],
mime: 'application/vnd.sun.xml.writer',
},
{
ext: 'bz2',
signs: ['425A68'],
mime: 'application/x-bzip2',
},
{
ext: 'vcd',
signs: ['454E5452595643440200000102001858'],
mime: 'application/x-cdlink',
},
{
ext: 'csh',
signs: ['6375736800000002000000'],
mime: 'application/x-csh',
},
{
ext: 'spl',
signs: ['00000100'],
mime: 'application/x-futuresplash',
},
{
ext: 'jar',
signs: ['4A4152435300', '504B0304', '504B0304140008000800', '5F27A889'],
mime: 'application/x-java-archive',
},
{
ext: 'rpm',
signs: ['EDABEEDB'],
mime: 'application/x-rpm',
},
{
ext: 'swf',
signs: ['435753', '465753', '5A5753'],
mime: 'application/x-shockwave-flash',
},
{
ext: 'sit',
signs: ['5349542100', '5374756666497420286329313939372D'],
mime: 'application/x-stuffit',
},
{
ext: 'tar',
signs: ['7,7573746172'],
mime: 'application/x-tar',
},
{
ext: 'xpi',
signs: ['504B0304'],
mime: 'application/x-xpinstall',
},
{
ext: 'xz',
signs: ['FD377A585A00'],
mime: 'application/x-xz',
},
{
ext: 'mid',
signs: ['4D546864'],
mime: 'audio/midi',
},
{
ext: 'midi',
signs: ['4D546864'],
mime: 'audio/midi',
},
{
ext: 'aiff',
signs: ['464F524D00'],
mime: 'audio/x-aiff',
},
{
ext: 'flac',
signs: ['664C614300000022'],
mime: 'audio/x-flac',
},
{
ext: 'wma',
signs: ['3026B2758E66CF11A6D900AA0062CE6C'],
mime: 'audio/x-ms-wma',
},
{
ext: 'ram',
signs: ['727473703A2F2F'],
mime: 'audio/x-pn-realaudio',
},
{
ext: 'rm',
signs: ['2E524D46'],
mime: 'audio/x-pn-realaudio',
},
{
ext: 'ra',
signs: ['2E524D460000001200', '2E7261FD00'],
mime: 'audio/x-realaudio',
},
{
ext: 'wav',
signs: ['52494646'],
mime: 'audio/x-wav',
},
{
ext: 'webp',
signs: ['52494646'],
mime: 'image/webp',
},
{
ext: 'pgm',
signs: ['50350A'],
mime: 'image/x-portable-graymap',
},
{
ext: 'rgb',
signs: ['01DA01010003'],
mime: 'image/x-rgb',
},
{
ext: 'webm',
signs: ['1A45DFA3'],
mime: 'video/webm',
},
{
ext: 'flv',
signs: ['00000020667479704D345620', '464C5601'],
mime: 'video/x-flv',
},
{
ext: 'mkv',
signs: ['1A45DFA3'],
mime: 'video/x-matroska',
},
{
ext: 'asx',
signs: ['3C'],
mime: 'video/x-ms-asf',
},
{
ext: 'wmv',
signs: ['3026B2758E66CF11A6D900AA0062CE6C'],
mime: 'video/x-ms-wmv',
},
{
ext: 'avi',
signs: ['52494646'],
mime: 'video/x-msvideo',
},
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment