我使用Apache Tika从 base64 代表中检测文件Mime Type。 很遗憾,我没有关于该文件的其他信息(例如扩展名)。
我能做些什么让Tika更具体?
我目前正在使用这个:
Tika tika = new Tika();
tika.setMaxStringLength(-1);
String mimetype = tika.detect(Base64.decode(fileString));
它为JSON和PDF文件提供了text/plain
,但我希望获得更具体的信息:application/json
,application/pdf
等......
希望有人可以帮助我!
感谢。
答案 0 :(得分:4)
在我过去的项目中,我使用了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[]
:
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 ....
我希望它有用
安吉洛
答案 1 :(得分:4)
<强> from urllib import urlencode
强>
检测具有给定文件名的文档的媒体类型。
传递PDF或JSON文件的内容将无法用作this method expects a filename。 Tika将回退到Tika#detect(String)
,因为它找不到任何匹配的文件名。
<强> PDF 强>
对于PDF,您只需要将一些数据写入流中,或者将其传递给某些字节,并通过寻找特殊(“魔术”)字节模式让Tika使用Mime Magic Detection读取靠近文件的开头(纯文本为text/plain
):
%PDF
<强> JSON 强>
对于JSON,即使这种方法也会返回String pdfContent = "%PDF-1.4\n%\\E2\\E3\\CF\\D3"; // i.e. base64 decoded
Tika tika = new Tika();
System.out.println(tika.detect(pdfContent.getBytes())); // "application/pdf"
&amp;蒂卡是对的。 text/plain
就像纯文本的子类型,表示文本应该被不同地解释。这就是你得到application/json
时必须要做的事情。使用JSON库(例如Jackson)来解析内容以查看它是否是有效的JSON:
text/plain
因为杰克逊将单个数字Sring json = "[1, 2, 3]"; // an array in JSON
try {
final JsonParser parser = new ObjectMapper().getFactory().createParser(json);
while (parser.nextToken() != null) {
}
System.out.println("Probably JSON!");
} catch (Exception e) {
System.out.println("Definitely not JSON!");
}
视为有效的JSON,所以要小心你想要多严格,但事实并非如此。为了解决这个问题,您可以首先测试字符串以1
或{
开头(可能前面有空格),使用[
之类的内容,甚至尝试将其解析为JSON