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
相关产品推荐
相关产品推荐

