MultipartFile上传文件根据魔数来判断上传文件格式,不要再用后缀进行判断了

本文介绍了如何通过文件魔数来判断文件类型,特别是在后缀不可靠的情况下,如使用Java代码中的FileMagic类。着重讲解了Excel文件的BIFF格式版本,以及如何通过ApachePOI处理不同版本的Excel文件。
摘要由CSDN通过智能技术生成

前言
我们判断一个上传文件的格式,大多数会进行后缀判断,可是文件的后缀格式可以修改,所以很容易绕过判断,那么今天就给大家讲一下魔数判断文件格式的代码和方法
什么是文件魔数
文件魔数(Magic Number)是文件的一小部分数据,通常是文件的头部字节,用来识别文件的类型。每种文件类型都有其特定的魔数,这些魔数是固定的,并且不同文件类型的魔数通常是不同的。

文件魔数通常被用于确定文件的类型,尤其是在文件没有扩展名或者文件扩展名不准确的情况下。通过读取文件的魔数,程序可以识别文件的实际类型,并采取相应的处理方式。

举个例子,常见的JPEG图像文件的魔数是FF D8 FF,PDF文件的魔数是25 50 44 46,ZIP文件的魔数是50 4B 03 04等等。这些魔数是文件格式的标识符,它们可以在文件的头部被找到。
具体代码实现

    public static boolean isExcelFile(MultipartFile file) {
        try {

            BufferedInputStream bufferedInputStream = FileUtils.convertMultipartFileToBufferedInputStream(file);
            // 读取文件的魔数
            FileMagic magic = FileMagic.valueOf(bufferedInputStream);
            // 检查魔数是否与Excel文件的魔数匹配
            return magic == FileMagic.OLE2 || magic == FileMagic.OOXML;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    public static BufferedInputStream convertMultipartFileToBufferedInputStream(MultipartFile multipartFile) throws IOException {
            // 使用BufferedInputStream来包装MultipartFile的输入流
            BufferedInputStream bufferedInputStream = new BufferedInputStream(multipartFile.getInputStream());

            // 调用mark(int)方法,设置标记位置
            bufferedInputStream.mark(Integer.MAX_VALUE);

            // 返回BufferedInputStream对象
            return bufferedInputStream;
    }

FileMagic.OLE2
对应excel的xls格式

FileMagic.OOXML
这个比较坑,因为它对应excel的xlsx格式,word的 docx格式,ppt的 pptx格式,还需要进一步判断后缀,内容
如果你无法通过文件的扩展名来判断文件类型,你可以通过检查文件的内容来确定。每种类型的Office Open XML文件都有其特定的文件结构和标识符。例如,docx文件的内容以<w:document>标签开始,而xlsx文件的内容以标签开始。

FileMagic.XML
对应xml文件**
FileMagic.BIFF2
FileMagic.BIFF2是Apache POI中的一个枚举值,用于表示Excel文件的一种早期版本的格式。BIFF是Excel二进制文件格式(Binary Interchange File Format)的简称,而BIFF2则是其中的一个具体版本。

BIFF2格式是Excel 2.0版本中使用的二进制文件格式,它是Excel 2.0的主要文件格式之一。Excel 2.0是Microsoft Excel的早期版本,最初发布于1987年。BIFF2文件使用二进制编码,包含了电子表格中的数据、格式、公式等信息。

由于BIFF2是Excel的旧版本,因此在处理此类文件时需要使用特定的解析器。在Apache POI中,通过使用FileMagic.BIFF2枚举值,可以识别并处理这种类型的Excel文件。

尽管BIFF2格式现在已经过时,但对于历史文档或者特定需求,仍然可能需要处理它们。Apache POI库提供了一种方便的方式来解析和操作各种版本的Excel文件,包括旧版本的BIFF2文件。
FileMagic.BIFF3

FileMagic.BIFF3是Apache POI中的一个枚举值,用于表示Excel文件的另一种早期版本的格式。在Excel的二进制文件格式(Binary Interchange File Format,BIFF)中,BIFF3是一种特定的版本。

BIFF3格式是Excel 3.0版本中使用的二进制文件格式。Excel 3.0是Microsoft Excel的早期版本,最初发布于1990年。BIFF3文件使用二进制编码,包含了电子表格中的数据、格式、公式等信息。

尽管BIFF3也是Excel的旧版本,但在处理此类文件时需要使用特定的解析器。Apache POI库通过FileMagic.BIFF3枚举值来识别和处理这种类型的Excel文件。

值得注意的是,随着Excel的发展,BIFF格式也经历了多次更新和改进。后续版本的Excel引入了新的文件格式,例如BIFF4、BIFF5、BIFF8等,每个版本都带来了新的功能和改进。但对于历史文档或者特定需求,仍然可能需要处理旧版本的BIFF文件。Apache POI库提供了一种方便的方式来解析和操作各种版本的Excel文件,包括旧版本的BIFF文件。
FileMagic.BIFF4

FileMagic.BIFF4是Apache POI中的一个枚举值,用于表示Excel文件的另一种早期版本的格式。在Excel的二进制文件格式(Binary Interchange File Format,BIFF)中,BIFF4是一种特定的版本。

BIFF4格式是Excel 4.0版本中使用的二进制文件格式。Excel 4.0是Microsoft Excel的一个重要版本,它于1992年发布。BIFF4文件使用二进制编码,包含了电子表格中的数据、格式、公式等信息。

尽管BIFF4也是Excel的旧版本,但在处理此类文件时需要使用特定的解析器。Apache POI库通过FileMagic.BIFF4枚举值来识别和处理这种类型的Excel文件。

值得注意的是,随着Excel的发展,BIFF格式也经历了多次更新和改进。后续版本的Excel引入了新的文件格式,例如BIFF5、BIFF8等,每个版本都带来了新的功能和改进。但对于历史文档或者特定需求,仍然可能需要处理旧版本的BIFF文件。Apache POI库提供了一种方便的方式来解析和操作各种版本的Excel文件,包括旧版本的BIFF文件。
FileMagic.MSWRITE

FileMagic.MSWRITE是Apache POI中的一个枚举值,用于表示Microsoft Write文件的文件类型。

Microsoft Write是Microsoft Windows操作系统的一个简单的文本处理程序,最早是在Windows 1.0中引入的。它提供了基本的文本编辑功能,包括文本输入、编辑、格式化等。Microsoft Write使用了自己的文件格式来保存文档,这些文件通常以.wri为扩展名。

在Apache POI中,通过FileMagic.MSWRITE枚举值,可以识别和处理Microsoft Write文件。Apache POI库提供了一种方便的方式来解析和操作各种类型的文件,包括Microsoft Write文件。

FileMagic.RTF
对应rtf格式文件
FileMagic.PDF
对应pdf文件
FileMagic.HTML
对应html文件
FileMagic.WORD2
对应.doc文件
FileMagic.JPEG
对应jpeg后缀
FileMagic.GIF
对应gif后缀
FileMagic.PNG
对应png后缀
FileMagic.TIFF
对应tiff后缀
FileMagic.WMF
对应wmf后缀
FileMagic.EMF
对应emf后缀
FileMagic.BMP
对应bmp后缀

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值