我使用此功能获取文件contentType,当使用.jpg文件接收" Image/jpg"时。使用.mp4接收"视频/QuickTime"
public static String detectMediaType(String fileName,byte[] data) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
AutoDetectParser parser = new AutoDetectParser();
Detector detector = parser.getDetector();
Metadata md = new Metadata();
md.add(Metadata.RESOURCE_NAME_KEY, fileName);
try{
MediaType mediaType = detector.detect(inputStream, md);
return mediaType.toString();
}catch (IOException ex){
throw new RuntimeException("Failed to detect mediaType for file: " + fileName,ex);
}
}
这是可以预期的,因为您使用的是TIKA检测器功能,该功能对于MP4或其他QuickTime格式返回通用的'视频/QuickTime'。如果需要获得"视频/MP4"之类的精确类型,则应使用Tika Parser,例如:
if (mediaType.equals(MediaType.video("quicktime"))) {
Parser parser = new AutoDetectParser();
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
parser.parse(inputStream, handler, metadata, context);
}
我使用tikas defaultDetector也有相同的问题。
解决方案,如下所示:https://tika.apache.org/2.3.0/detection.html(在"容器"识别检测"下),是使用TikaInputStream
,而不是标准的InputStream
。P>
detector.detect(TikaInputStream.get(inputStream), metadata);
- 不要忘记关闭流。
- 还确保
tika-parsers-*
JAR在类路径中。
我有同样的问题,并且想知道,为什么我仍然得到" video/quicktime"在使用上面的答案后,作为模拟型。因此,要结论一切:
-
使用解析器检测元数据(如第一个答案中)
-
使用tikainputstream(如第二个答案中),但是 not 尝试重复使用
-
在您的依赖项中包括一个特定的解析器(在这种情况下,是 org.apache.tika.tika.mp4.mp4.mp4parser
Tika tika = new Tika(); String detectedType; try ( TikaInputStream parserInputStream = TikaInputStream.get(new ByteArrayInputStream(bytes)); TikaInputStream detectionInputStream = TikaInputStream.get(new ByteArrayInputStream(bytes)); ) { // reading metadata from file, important for video type detection (quicktime, mp4, ...) Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); parser.parse(parserInputStream, handler, metadata, context); // read the type // would like to reuse the stream from above (used by parser), but this can end in a wrong mimetype // parserInputStream.reset(); detectedType = tika.detect(detectionInputStream, metadata); } catch (Exception ex) { detectedType = tika.detect(bytes); log.warn("Could not read MimeType of file '{}' using Metadata, using fallback detection: '{}'", file.getOriginalFilename(), detectedType); }
依赖项,例如在Maven中:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parser-audiovideo-module</artifactId>
<scope>runtime</scope>
</dependency>