在Java中获取文件的Mime类型

不羁的心 提交于 2020-03-10 15:03:50

我只是想知道大多数人如何从Java文件中获取mime类型? 到目前为止,我已经尝试了两个JMimeMagicJMimeMagicMime-Util

第一个给我内存异常,第二个没有正确关闭其流。 我只是想知道其他人是否拥有他们使用和正常工作的方法/库?


#1楼

我尝试了几种方法,包括@Joshua Fox说的第一种方法。 但是有些不能识别频繁的模仿类型,例如PDF文件,而另一些不能被伪造文件信任(我尝试将扩展名更改为TIF的RAR文件)。 我发现的解决方案(如@Joshua Fox所言)是使用MimeUtil2 ,如下所示:

MimeUtil2 mimeUtil = new MimeUtil2();
mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
String mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file)).toString();

#2楼

如果您是Android开发人员,则可以使用实用程序类android.webkit.MimeTypeMap ,它将MIME类型映射到文件扩展名,反之亦然。

以下代码段可能会对您有所帮助。

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

#3楼

Apache Tikatika-core中提供了基于流前缀中的魔术标记的mime类型检测。 tika-core不会获取其他依赖关系,这使其与当前未维护的Mime Type Detection Utility一样轻巧。

简单的代码示例(爪哇7),使用变量theInputStreamtheFileName

try (InputStream is = theInputStream;
        BufferedInputStream bis = new BufferedInputStream(is);) {
    AutoDetectParser parser = new AutoDetectParser();
    Detector detector = parser.getDetector();
    Metadata md = new Metadata();
    md.add(Metadata.RESOURCE_NAME_KEY, theFileName);
    MediaType mediaType = detector.detect(bis, md);
    return mediaType.toString();
}

请注意,MediaType.detect(...)不能直接使用( TIKA-1120 )。 有关更多提示, 访问https://tika.apache.org/0.10/detection.html


#4楼

我只是想知道大多数人如何从Java文件中获取mime类型?

我已经发布了SimpleMagic Java程序包,该程序包允许从文件和字节数组确定内容类型(MIME类型)。 它旨在读取和运行Unix file(1)命令魔术文件,这些文件是大多数〜Unix OS配置的一部分。

我试过的Apache提卡但吨的依赖,这是巨大 URLConnection不使用文件的字节, MimetypesFileTypeMap也只是看文件名。

使用SimpleMagic,您可以执行以下操作:

// create a magic utility using the internal magic file
ContentInfoUtil util = new ContentInfoUtil();
// if you want to use a different config file(s), you can load them by hand:
// ContentInfoUtil util = new ContentInfoUtil("/etc/magic");
...
ContentInfo info = util.findMatch("/tmp/upload.tmp");
// or
ContentInfo info = util.findMatch(inputStream);
// or
ContentInfo info = util.findMatch(contentByteArray);

// null if no match
if (info != null) {
   String mimeType = info.getMimeType();
}

#5楼

如果您坚持使用Java 5-6,那么来自伺服开源产品的此实用程序类。

您只需要此功能

public static String getContentType(byte[] data, String name)

它探测内容的前几个字节,并根据该内容而不是文件扩展名返回内容类型。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!