js文件上传精准校验文件类型,防止直接.mp4改成.mp3上传

本文介绍了一种精确判断上传文件类型的方案,避免用户修改文件后缀导致的格式错误。通过读取文件头并匹配特定编码实现,提供了JavaScript实现示例。
该文章已生成可运行项目,

一个完成音乐上传的需求,按照常理都是在onChange的时候拿file的type来判断类型对不对,这样是存在很大风险的,如果用户直接修改了文件名的后缀,比如.mp4直接改成.mp3,在不支持的播放器中肯定会出现不能播放的问题。
如何能精准的判断一个文件的类型呢,通过上传文件的type肯定是不行的,我们需要读到原始文件类型的,查阅资料可知,每种类型都有自己独有的文件头,这个是不会改变的,所有可以拿到文件头来判断
封装的方法

  function getFileMimeType(file) {
        const map = {
            'FFD8FFE0': 'jpg',
            '89504E47': 'png',
            '47494638': 'gif',
            "52494646": 'webp',
            "0000001C": 'mp4',
        }

        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);
                }
            };
        });
    }

可以看到 getFileMimeType 方法中有个map数组,key就是对应格式的文件头编码,如果还想知道其他的类型的文件头编码可以在网上查一下,也可以自己打断点上传要判断的类型,断点看key,拿到key在map增加即可。
使用getFileMimeType

    $("#file-input").bind("change", function () {
      let files = this.files;
      let file = this.files[0];
        if (file) {
           getFileMimeType(file).then(res => {
            if (res == 'mp4') {
                    return alert('文件格式不正确,不支持直接修改文件后缀名上传');
                } else {
                //处理正常上传逻辑
                }
             });

        }
      })

到现在已经完成了我的需求,如有错误欢迎指正

本文章已经生成可运行项目
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值