Magic Number 校验Excel文件(Java)

8 篇文章 0 订阅

工作中遇到需要用poi解析导入的Excel文件的case,之前同事写的,我发现他做文件格式校验只是做了文件名后缀的解析。这样会有个问题,就是其他格式的文件是可以修改后缀的,这样就可以通过校验,做解析。虽然也有异常处理,但是我们无法定位到这是因为文件格式不对抛的异常。所以我在网上查了下,发现一个校验方法,就是通过魔数(Magic Number)。最著名的魔数就是平方根倒数算法,雷神之锤:

i  = 0x5f3759df - ( i >> 1 ); 

我也不懂啥意思,先不管。我们平时写代码你在参数里突兀的直接用了字符串或者数字,编辑器提示你这是个魔法值,不规范。比如你算圆面积float r = 3.333; S=r^2*3.14;很明显这个3.14就是个魔数。但这些都跟我接下来写的东西没多少关系。 

这里就不写原理了,网上有很多。我只贴出代码吧

util类:

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.Objects;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.poifs.filesystem.FileMagic;

@Slf4j
public class PoiReadUtil {
    public static boolean isExcelFile(InputStream is) {
        boolean result = false;
        try {
            FileMagic fileMagic = FileMagic.valueOf(new BufferedInputStream(is));
            if (Objects.equals(fileMagic, FileMagic.OLE2)
                    || Objects.equals(fileMagic, FileMagic.OOXML)) {
                result = true;
            }
        } catch (Exception e) {
            log.error("Exception when check the excel file:", e);
            return false;
        }
        return result;
    }
}

这篇写的有点水,不过测试过是可用的,像魔数这些概念,在.class字节码文件中也用到过。这里就不做深入探讨。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Java中,可以使用以下方法来校验文件的格式: 1. 使用文件扩展名进行校验:可以通过获取文件的扩展名,然后与预期的文件格式进行比较来进行校验。例如,假设我们要校验一个文件是否为图片格式(.jpg、.png、.gif等),可以使用以下代码: ```java File file = new File("path/to/file.jpg"); String extension = getFileExtension(file); if (extension != null && (extension.equals("jpg") || extension.equals("png") || extension.equals("gif"))) { System.out.println("文件格式正确"); } else { System.out.println("文件格式不正确"); } // 获取文件的扩展名 private static String getFileExtension(File file) { String fileName = file.getName(); int dotIndex = fileName.lastIndexOf("."); if (dotIndex >= 0 && dotIndex < fileName.length() - 1) { return fileName.substring(dotIndex + 1).toLowerCase(); } return null; } ``` 2. 使用文件的魔术数字进行校验:每种文件格式都有一个特定的文件头(也称为魔术数字),可以通过读取文件的前几个字节来判断文件的格式。可以通过比较文件的魔术数字与预期的魔术数字来进行校验。以下是一个示例代码,用于校验一个文件是否为PDF格式: ```java File file = new File("path/to/file.pdf"); byte[] magicNumbers = new byte[]{0x25, 0x50, 0x44, 0x46}; // PDF文件的魔术数字 try (InputStream inputStream = new FileInputStream(file)) { byte[] fileHeader = new byte[magicNumbers.length]; inputStream.read(fileHeader); if (Arrays.equals(fileHeader, magicNumbers)) { System.out.println("文件格式正确"); } else { System.out.println("文件格式不正确"); } } catch (IOException e) { e.printStackTrace(); } ``` 请注意,以上方法仅仅是一种简单的校验方式,不能保证文件的完全正确性。如果需要对文件进行更严格的校验,可能需要使用外部库或者检查文件的内容结构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值