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"
}