You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Tika无法正确识别AAC文件类型问题求助

如何用Apache Tika正确识别AAC文件的MIME类型?

我在文件上传场景中尝试用Apache Tika库获取文件类型/MIME类型,已知AAC扩展名的文件是Tika支持的,但用以下方法始终得到application/octet-stream,尝试Tika Parsers也无法正确识别:

问题重现

检测文档类型

public static String detectDocTypeUsingDetector(InputStream stream) 
  throws IOException {
    Detector detector = new DefaultDetector();
    Metadata metadata = new Metadata();

    MediaType mediaType = detector.detect(stream, metadata);
    return mediaType.toString();
}

返回结果:application/octet-stream

提取内容(尝试1)

public static String extractContentUsingParser(InputStream stream) 
  throws IOException, TikaException, SAXException {
 
    Parser parser = new AutoDetectParser();
    ContentHandler handler = new BodyContentHandler();
    Metadata metadata = new Metadata();
    ParseContext context = new ParseContext();

    parser.parse(stream, handler, metadata, context);
    return handler.toString();
}

返回结果:""(空字符串)

提取内容(尝试2)

public static String extractContentUsingParser(InputStream stream) 
  throws IOException, TikaException, SAXException {
 
    Parser parser = new AutoDetectParser();
    ContentHandler handler = new BodyContentHandler();
    Metadata metadata = new Metadata();
    ParseContext context = new ParseContext();

    parser.parse(stream, handler, metadata, context);
    return handler.toString();
}

返回结果:"resourceName=name"

解决方案

1. 给Metadata传入文件名(核心修复)

Tika的类型检测会结合文件内容和文件名/扩展名双重判断,仅传入InputStream时,Tika无法利用扩展名辅助识别,容易误判为二进制流。修改检测方法,传入带扩展名的文件名:

public static String detectDocTypeUsingDetector(InputStream stream, String fileName) 
  throws IOException {
    Detector detector = new DefaultDetector();
    Metadata metadata = new Metadata();
    // 传入带扩展名的文件名,触发Tika的扩展名匹配逻辑
    metadata.set(Metadata.RESOURCE_NAME_KEY, fileName);

    MediaType mediaType = detector.detect(stream, metadata);
    return mediaType.toString();
}

调用时传入类似"audio_file.aac"的文件名,即可返回正确的audio/aac类型。

2. 确保依赖完整

如果仅引入tika-core,会缺少音频文件的解析规则。需引入完整的解析器包,以Maven为例:

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.9.1</version> <!-- 使用最新稳定版 -->
</dependency>

3. 从Metadata提取MIME类型(解析场景)

使用Parser时,不要通过返回内容判断类型,而是直接从解析后的Metadata中获取Content-Type:

public static String getMimeTypeUsingParser(InputStream stream, String fileName) 
  throws IOException, TikaException, SAXException {
    Parser parser = new AutoDetectParser();
    ContentHandler handler = new BodyContentHandler();
    Metadata metadata = new Metadata();
    metadata.set(Metadata.RESOURCE_NAME_KEY, fileName);
    ParseContext context = new ParseContext();

    parser.parse(stream, handler, metadata, context);
    // 从Metadata中读取内容类型
    return metadata.get(Metadata.CONTENT_TYPE);
}

内容的提问来源于stack exchange,提问作者binary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:01:17