import TYPEMAP from "./filetype.json";
 
const getHeaderValue = (value, n) => {
	const arr = new Uint8Array(value);
	let header = "";
	for (let i = 0; i < arr.length; i++) {
		const v = arr[i].toString(16);
		header += v.length === 1 && v === "0" ? "0" + v : v;
	}
	return header;
};
/**
 * file header get type
 * @param {*} value16
 * @param {*} change
 */
const handleFileType = (value16, change) => {
	let header3 = value16.substring(0, 3 * 2),
		header4 = value16.substring(0, 4 * 2),
		header8 = value16.substring(0, 16 * 2);
	let type = TYPEMAP[header4] || TYPEMAP[header3] || "";
	if (type === "") {
		for (let key of Object.keys(TYPEMAP)) {
			let arr = key.split(/\{\d+,\d+\}/, 2);
			if (!arr[1]) {
				continue;
			}
			if (header8.substring(0, arr[0].length) === arr[0]) {
				const siteArr = key
					.match(/\{(\d+,\d+)\}/)[1]
					.split(",")
					.map((e) => e | 0);
				const startSite = arr[1].length + siteArr[0] + 2;
				if (header8.substring(startSite, startSite + siteArr[1]) === arr[1]) {
					type = TYPEMAP[key];
					break;
				}
			} else {
				continue;
			}
		}
	}
	change && change(type);
};
 
/**
 *  get file type
 * @param {*} blob
 * @param {(type: string) => void} change (type) => void
 * @returns Promise<(type) => void>
 */
export const getFileType = (blob, change) => {
	var fileReader = new FileReader();
	return new Promise((resolve, reject) => {
		fileReader.onloadend = function ({ target }) {
			handleFileType(getHeaderValue(target.result), (type) => {
				resolve(type);
				change && change(type);
			});
		};
		try {
			fileReader.readAsArrayBuffer(blob);
		} catch (error) {
			console.log(error);
			reject(error);
		}
	});
};

FileType. Json

{
	"47494638": "image/gif",
	"89504e47": "image/png",
	"ffd8ffe0": "image/jpeg",
	"ffd8ffe1": "image/jpeg",
	"ffd8ffe2": "image/jpeg",
	"ffd8ffe3": "image/jpeg",
	"ffd8ffe8": "image/jpeg",
	"52494646{8,4}5745": "image/webp",
	"52494646{8,4}4156": "video/avi",
	"464C56": "video/flv",
	"00000018": "video/mp4",
	"00000020": "video/mp4",
	"52494646,4143": "ani",
	"52494646,4344": "cda",
	"52494646,514c": "qcp"
}