Java根据byte[]内容获取文件类型

本文介绍了如何在Java项目中通过添加ApacheTika和jmimemagic的依赖来实现文件内容的自动检测,包括使用AutoDetectParser解析文件类型并获取后缀名,以及在遇到问题时采用MagicMatch进行补充。测试部分展示了代码在本地文件上的应用效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出啊

1、添加pom依赖

        <properties>
           <java.version>1.8</java.version>
           <tika.version>1.26</tika.version>
           <jmimemagic.version>0.1.5</jmimemagic.version>
        </properties>        
        <!-- 文件类型检测 -->
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>${tika.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parsers</artifactId>
            <version>${tika.version}</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jmimemagic</groupId>
            <artifactId>jmimemagic</artifactId>
            <version>${jmimemagic.version}</version>
        </dependency>

2、实现代码


    /**
     * 获取文件后缀
     *
     * @param fileContent 文件内容
     * @return java.lang.String
     * @author demo
     * @since 2024/1/30 14:06
     **/
    private String getFileExtension(byte[] fileContent) {
        InputStream is = new ByteArrayInputStream(fileContent);
        AutoDetectParser parser = new AutoDetectParser();
        Metadata metadata = new Metadata();
        org.apache.tika.mime.MediaType mediaType;
        try {
            ContentHandler handler = new BodyContentHandler();
            parser.parse(is, handler, metadata);
            mediaType = org.apache.tika.mime.MediaType.parse(metadata.get(HttpHeaders.CONTENT_TYPE));
            TikaConfig tikaConfig = TikaConfig.getDefaultConfig();
            MimeTypes allTypes = tikaConfig.getMimeRepository();
            return allTypes.forName(mediaType.toString()).getExtension();
        } catch (Exception e) {
            try {
                MagicMatch match = Magic.getMagicMatch(fileContent);
                return "." + match.getExtension();
            } catch (Exception e1) {
                log.error("getFileType error", e);
            }
            return null;
        }
    }

3、测试效果

测试本地文件类型和后缀

 public static void main(String[] args) throws Exception {
        List<File> files = FileUtil.loopFiles("C:\\Users\\liubei\\Downloads\\test");
        for (File file : files) {
            byte[] fileContent = FileUtil.readBytes(file);
            try {
                String extension = getFileExtension(fileContent);
                System.out.println("fileName:" + file.getName() + ",fileExtension:" + extension);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

输出结果

MagicMatch  fileName:testing-with-spock.pdf,getExtension:pdf
fileName:Marelli - 0919.xls,fileExtension:.xls
fileName:R-C.gif,fileExtension:.gif
fileName:R-C.jfif,fileExtension:.jpg
fileName:rose-blue-flower-rose-blooms-67636.jpeg,fileExtension:.jpg
fileName:txtTest.txt,fileExtension:
fileName:1c7b5b29262f292c64_hd.jpg,fileExtension:.jpg
MagicMatch  fileName:软件架构设计_PreE4_V0.1.docx,getExtension:docx
fileName:5W2H分析法培训教材.ppt,fileExtension:.ppt
fileName:新建 Microsoft Excel 工作表.xlsx,fileExtension:.xlsx
fileName:新建 Microsoft Word 文档.docx,fileExtension:.docx
fileName:研发分支管理.pptx,fileExtension:.pptx
fileName:研发标准化实践.png,fileExtension:.png
fileName:系统性能测试.xlsx,fileExtension:.xlsx
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值