Java ApacheTika-检测特定于JSON/PDF的mime类型

Java ApacheTika-检测特定于JSON/PDF的mime类型,java,mime-types,apache-tika,Java,Mime Types,Apache Tika,我正在使用从其base64rapresentation检测文件Mime类型。 不幸的是,我没有关于该文件的其他信息(例如扩展名) 我能做些什么让蒂卡更具体些吗 我目前正在使用这个: Tika tika = new Tika(); tika.setMaxStringLength(-1); String mimetype = tika.detect(Base64.decode(fileString)); 它为JSON和PDF文件提供了text/plain,但我想获得更具体的信息:applicati

我正在使用从其base64rapresentation检测文件Mime类型。 不幸的是,我没有关于该文件的其他信息(例如扩展名)

我能做些什么让蒂卡更具体些吗

我目前正在使用这个:

Tika tika = new Tika();
tika.setMaxStringLength(-1);
String mimetype = tika.detect(Base64.decode(fileString));
它为JSON和PDF文件提供了
text/plain
,但我想获得更具体的信息:
application/JSON
application/PDF
等等

希望有人能帮助我


谢谢。

在我过去的项目中,我使用了
TikaConfig

我所做的是:

//Note you can use alse byte[] instead of InputStream
InputStream is = new FileInputStream(new File(YOUR_FILE));
TikaConfig tc = new TikaConfig();
Metadata md = new Metadata();
md.set(Metadata.RESOURCE_NAME_KEY, fileName);
String mimeType = tc.getDetector().detect(TikaInputStream.get(is), md).toString();
通过使用
字节[]

byte[] fileBytes = GET_BYTE_ARRAY_FROM_YOUR_FILE;
TikaConfig tc = new TikaConfig();
Metadata md = new Metadata();
md.set(Metadata.RESOURCE_NAME_KEY, fileName);
String mimeType = tc.getDetector().detect(TikaInputStream.get(fileBytes), md).toString();
我在得到正确的mimeType方面没有问题

我希望它有用

Angelo

Tika#检测(字符串)

检测具有给定文件名的文档的媒体类型

传递PDF或JSON文件的内容将不起作用。Tika将退回到
text/plain
,因为它找不到任何匹配的文件名

PDF

对于PDF,您只需将部分数据写入流,或将部分字节传递给流,并让Tika通过在文件开头附近查找特殊(“魔法”)字节模式(纯文本为
%PDF
):

String pdfContent=“%PDF-1.4\n%\\E2\\E3\\CF\\D3”//i、 e.base64已解码
Tika Tika=新Tika();
System.out.println(tika.detect(pdfContent.getBytes());//“应用程序/pdf”
JSON

但是对于JSON,即使这个方法也会返回
text/plain
&Tika是正确的
application/json
类似于纯文本的一个子类型,表示应该以不同的方式解释文本。因此,如果您得到
text/plain
,您就必须这样做。使用JSON库(例如)解析内容以查看其是否为有效的JSON:

Sring json=“[1,2,3]”;//JSON中的数组
试一试{
final JsonParser parser=新的ObjectMapper().getFactory().createParser(json);
while(parser.nextToken()!=null){
}
System.out.println(“可能是JSON!”);
}捕获(例外e){
System.out.println(“绝对不是JSON!”);
}
只是要注意你想要的严格程度,因为Jackson将单个数字
1
视为有效的JSON,但实际上并不是。为了解决这个问题,您可以首先测试字符串是否以
{
[
(前面可能有空格)开头,使用类似于
json.matches(“^\\s*[\[\[].])
的内容,然后再尝试将其解析为json


这是一个。

谢谢你的回答,问题是我没有文件名,只有文件的base64字符串表示形式。你可以使用一个假文件名,但是Tika没有给出确切的mimeType-application/json而不是text/plain的问题仍然存在。如果你检查流,它将是application/json。你应该怎么做要做的是编写一个临时文件,然后让Tika检查临时文件
Base64。解码(fileString)。getBytes()
是正确检测PDF所需的全部内容。有关JSON部分,请参阅。