Apache Tika无法通过文件内容检测Content-Type问题咨询
问题原因
Apache Tika默认的内容检测逻辑对纯文本的判定设置了较高的特征阈值,避免把无规律的二进制小文件误识别为文本。你遇到的仅含èå2个字符的短文本特征过少,达不到默认的文本判定阈值,所以识别失败;而长文本有足够的字符分布特征可以命中ISO-8859-1文本的匹配规则,因此可以正常识别。
可行解决方案
- 调整Tika检测逻辑,强制忽略扩展名干扰,使用仅依赖内容的重载方法,清空元数据中的文件名信息避免
.tmp扩展名影响检测结果,示例代码:
Tika tika = new Tika(); File file = new File(filepath); try (InputStream inputStream = new FileInputStream(file)) { Metadata metadata = new Metadata(); // 移除文件名信息,避免扩展名干扰检测 metadata.set(Metadata.RESOURCE_NAME_KEY, ""); String mimeType = tika.detect(inputStream, metadata); }
- 调整文本检测阈值:Tika 2.x版本内置
TextStatisticsDetector,可通过配置将纯文本判定的最小字符阈值从默认的10调整为2,匹配极短文本的识别需求,修改tika-config.xml配置如下:
<properties> <detectors> <detector class="org.apache.tika.detect.TextStatisticsDetector"> <params> <param name="minTextChars" type="int">2</param> </params> </detector> <detector class="org.apache.tika.detect.DefaultDetector"/> </detectors> </properties>
如果使用1.x版本无内置该检测器,可自定义简单的检测器实现相同的阈值判定逻辑,叠加到默认检测器前即可。
- 增加自定义MIME匹配规则:自定义ISO-8859-1纯文本的匹配规则,当文件所有字节都落在0x00-0x7F(ASCII)和0xA0-0xFF(ISO-8859-1可打印字符)区间时,直接判定为
text/plain,该规则可以和Tika默认检测逻辑叠加使用。 - 增加兜底检测逻辑:当Tika返回默认的
application/octet-stream结果时,调用字符编码检测工具(如ICU4J、juniversalchardet)二次校验,如果检测到有效文本编码(如ISO-8859-1、ASCII等),直接返回text/plain,即可对齐Linux file命令的检测效果。
内容的提问来源于stack exchange,提问作者Aman Todi
相关产品推荐
相关产品推荐

