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

    将上传文件转为二进制形式后,再获取其前四位头文件的十六进制编码,根据这个就可以精准判定上传文件类型。对于不符合上传格式要求的,直接在客户端做处理。

    1. function getFileMimeType(file) {
    2. const map = {
    3. 'FFD8FFE0': 'jpg',
    4. '89504E47': 'png',
    5. '47494638': 'gif',
    6. "52494646": 'webp'
    7. }
    8. const reader = new FileReader();
    9. reader.readAsArrayBuffer(file);
    10. return new Promise((resolve, reject) => {
    11. reader.onload = (event) => {
    12. try {
    13. let array = new Uint8Array(event.target.result);
    14. array = array.slice(0, 4);
    15. let arr = [...array];
    16. let key = arr.map(item => item.toString(16).toUpperCase().padStart(2, '0'))
    17. .join('');
    18. resolve(map[key]);
    19. } catch (e) {
    20. reject(e);
    21. }
    22. };
    23. });
    24. }

    Html代码

    1. <form id="form">
    2. <p><input type="file" name="file" multiple id='file'></p>
    3. <p><input type="button" value="上传" id="btn"></p>
    4. </form>
    5. <script>
    6. let form = document.getElementById('form');
    7. let btn = document.getElementById('btn');
    8. let f = document.getElementById('file');
    9. btn.onclick = function () {
    10. if (f.files.length > 1) {
    11. for (const file of f.files) {
    12. upload(file)
    13. }
    14. } else {
    15. upload(f.files[0])
    16. }
    17. }
    18. function upload(file) {
    19. getFileMimeType(file).then(res => {
    20. if (res) {
    21. let fd = new FormData(form);
    22. let xhr = new XMLHttpRequest();
    23. xhr.open("post", '/api/uploadFiles');
    24. xhr.send(fd);
    25. } else {
    26. alert('文件格式不符合上传要求')
    27. f.value = ''
    28. return
    29. }
    30. }).catch(err => {
    31. console.log(err)
    32. })
    33. }
    34. </script>