java工具:通过文件头的魔数判断文件类型

k-file-detector

github: https://github.com/kylin-hunter/k-file-detector

介绍

一个检查文件类型的工具。

软件描述
根据文件的魔数 以及 内容判定文件类型
  1. 参考 https://www.garykessler.net/library/file_sigs.html
  2. 参考 xml/ooxml
安装教程
1、编译并发布到本地
        gradle clean build publishToMavenLocal -x test
2、gradle中使用 (gradle.org)
        implementation 'io.github.kylin-hunter:k-file-detector:1.0.11'
3、maven中使用 (maven.apache.org)
        <dependency>
          <groupId>io.github.kylin-hunter</groupId>
            <artifactId>k-file-detector</artifactId>
          <version>1.0.11</version>
        </dependency>
使用说明
  1. 支持的文件类型:

https://github.com/kylin-hunter/k-file-detector/blob/main/k-file-detector/src/main/resources/signature/file_types.yml

  1. 通过file检测

        DetectResult detectResult = FileDetector.detect(new File("xxxx.xxx"));  //通过file检测
        List<FileType> possibleFileTypes = detectResult.getPossibleFileTypes();
        for (FileType fileType : possibleFileTypes) {
            System.out.println("id=" + fileType.getId()); // 文件类型唯一编号
            System.out.println("extensions=" + fileType.getExtensions()); // 文件类型对应的扩展名,可能是空
            System.out.println("desc=" + fileType.getDesc()); //文件类型描述
        }
  1. 通过文件流检测

        try (InputStream in = new FileInputStream(new File("xxx.xxx"))) {
            DetectResult detectResult = FileDetector.detect(in); // 如果知道文件名也可以调用  FileDetector.detect(in,"xxx.xxx)
            List<FileType> possibleFileTypes = detectResult.getPossibleFileTypes();
            for (FileType fileType : possibleFileTypes) {
                System.out.println("id=" + fileType.getId()); // 文件类型唯一编号
                System.out.println("extensions=" + fileType.getExtensions()); // 文件类型对应的扩展名,可能是空
                System.out.println("desc=" + fileType.getDesc()); //文件类型描述
            }
        }
  1. 通过字节检测
        byte[] content = org.apache.commons.io.FileUtils.readFileToByteArray(new File("xxx.xxx"));
        DetectResult detectResult = FileDetector.detect(content); // 如果知道文件名也可以调用  FileDetector.detect(content,"xxx.xxx)
        List<FileType> possibleFileTypes = detectResult.getPossibleFileTypes();
        for (FileType fileType : possibleFileTypes) {
            System.out.println("id=" + fileType.getId()); // 文件类型唯一编号
            System.out.println("extensions=" + fileType.getExtensions()); // 文件类型对应的扩展名,可能是空
            System.out.println("desc=" + fileType.getDesc()); //文件类型描述
        }
  1. 结果打印示例:
2022-12-02 22:46:13.541 [main] INFO   -  io.github.kylinhunter.Test[25]: /Users/kylinhunter/k-file-detector/k-file-detector/src/test/resources/files/detected/office/2007/docx.docx
2022-12-02 22:46:13.677 [main] INFO   -  io.github.kylinhunter.Test[29]: id=k_docx
2022-12-02 22:46:13.677 [main] INFO   -  io.github.kylinhunter.Test[30]: extensions=[docx]
2022-12-02 22:46:13.677 [main] INFO   -  io.github.kylinhunter.Test[31]: desc=Microsoft Office  Word  File

2022-12-02 22:46:13.973 [main] INFO   -  io.github.kylinhunter.Test[25]: /Users/kylinhunter/k-file-detector/k-file-detector/src/test/resources/files/detected/audio_video/mov.mov
2022-12-02 22:46:13.974 [main] INFO   -  io.github.kylinhunter.Test[29]: id=mov
2022-12-02 22:46:13.974 [main] INFO   -  io.github.kylinhunter.Test[30]: extensions=[mov]
2022-12-02 22:46:13.974 [main] INFO   -  io.github.kylinhunter.Test[31]: desc=QuickTime movie file
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在Spring项目中可以通过以下步骤根据文件判断文件上传类型: 1. 添加依赖:在pom.xml文件中添加commons-io依赖,用于读取文件。 ```xml <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> ``` 2. 创建一个工具类,用于判断文件类型。比如,以下是一个判断图片文件类型工具类。 ```java public class FileTypeUtils { private static final Map<String, String> FILE_TYPE_MAP = new HashMap<>(); static { FILE_TYPE_MAP.put("jpg", "FFD8FF"); // JPEG FILE_TYPE_MAP.put("png", "89504E47"); // PNG FILE_TYPE_MAP.put("gif", "47494638"); // GIF FILE_TYPE_MAP.put("bmp", "424D"); // BMP } public static String getFileType(byte[] bytes) { String hex = StringUtils.toHexString(bytes); for (Map.Entry<String, String> entry : FILE_TYPE_MAP.entrySet()) { if (hex.startsWith(entry.getValue())) { return entry.getKey(); } } return null; } } ``` 3. 在上传文件的Controller中,读取文件判断文件类型。比如,以下是一个上传图片的Controller。 ```java @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) throws IOException { byte[] bytes = file.getBytes(); String fileType = FileTypeUtils.getFileType(bytes); if ("jpg".equals(fileType) || "png".equals(fileType) || "gif".equals(fileType) || "bmp".equals(fileType)) { // 上传图片 } else { // 文件类型不符合要求,返回错误信息 } return "success"; } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

羲圣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值