文件上传前前端通过魔数(magic number)去限制上传文件类型

文章讨论了在项目中如何准确判断文件类型,指出单纯依赖文件后缀可能存在风险,因为后缀可被修改且某些文件可能没有后缀。作者提出使用文件的头信息,特别是魔数(magicnumber)来识别文件的真实格式,以ELF文件为例展示了如何通过JavaScript的FileReaderAPI读取文件头四字节并进行比较,从而确定文件类型。
摘要由CSDN通过智能技术生成

问题

最近项目需求文件上传前判断文件类型,有的同学会说用文件后缀判断不就好啦。其一,文件后缀可以修改,正确性待考究;其二,有些文件并没有文件后缀。这就需要我们动动脑筋啦,其实我们可以根据文件的头信息,来判断文件真正的格式

前提:什么是魔数(magic number)?

对于某一些类型的文件,起始的几个字节内容都是固定的,根据这几个字节的内容就可以判断文件的类型,这就是魔数。例如常见的图片类型对应的魔数:
在这里插入图片描述

解决办法

这里以elf文件为例进行判断:

<template>
  <el-upload
    class="avatar-uploader"
    action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeUpload"
  >
    <img v-if="imageUrl" :src="imageUrl" class="avatar" />
    <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  </el-upload>
</template>

<script setup>
const isElfFile=(file)=> {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onloadend = function () {
      const magicNumber = new Uint8Array(reader.result.slice(0, 4));
      const elfMagic = new Uint8Array([0x7F, 0x45, 0x4C, 0x46]);

      for (let i = 0; i < magicNumber.length; i++) {
        if (magicNumber[i] !== elfMagic[i]) {
          resolve(false);
          return;
        }
      }

      resolve(true);
    };
    reader.onerror = function () {
      resolve(false);
    };

    reader.readAsArrayBuffer(file.slice(0, 4));
  });
}

const beforeUpload= async file=>{
const isElfType=await isElfFile(file)
if(isElfType){
//判断当文件类型为elf时需要进行的操作,巴拉巴拉。。。
}
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿乐今天敲代码没

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值