JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
Execute File(.exe .dll .drv .vxd .sys .ocx .vbx) 文件头:4D5A900003
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
将上传文件转为二进制形式后,再获取其前四位头文件的十六进制编码,根据这个就可以精准判定上传文件类型。对于不符合上传格式要求的,直接在客户端做处理。
function getFileMimeType(file) {
const map = {
'FFD8FFE0': 'jpg',
'89504E47': 'png',
'47494638': 'gif',
"52494646": 'webp'
}
const reader = new FileReader();
reader.readAsArrayBuffer(file);
return new Promise((resolve, reject) => {
reader.onload = (event) => {
try {
let array = new Uint8Array(event.target.result);
array = array.slice(0, 4);
let arr = [...array];
let key = arr.map(item => item.toString(16).toUpperCase().padStart(2, '0'))
.join('');
resolve(map[key]);
} catch (e) {
reject(e);
}
};
});
}
Html代码
<form id="form">
<p><input type="file" name="file" multiple id='file'></p>
<p><input type="button" value="上传" id="btn"></p>
</form>
<script>
let form = document.getElementById('form');
let btn = document.getElementById('btn');
let f = document.getElementById('file');
btn.onclick = function () {
if (f.files.length > 1) {
for (const file of f.files) {
upload(file)
}
} else {
upload(f.files[0])
}
}
function upload(file) {
getFileMimeType(file).then(res => {
if (res) {
let fd = new FormData(form);
let xhr = new XMLHttpRequest();
xhr.open("post", '/api/uploadFiles');
xhr.send(fd);
} else {
alert('文件格式不符合上传要求')
f.value = ''
return
}
}).catch(err => {
console.log(err)
})
}
</script>