我只是想知道大多数人如何从Java文件中获取mime类型? 到目前为止,我已经尝试了两个JMimeMagic
: JMimeMagic
和Mime-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 Tika在tika-core中提供了基于流前缀中的魔术标记的mime类型检测。 tika-core
不会获取其他依赖关系,这使其与当前未维护的Mime Type Detection Utility一样轻巧。
简单的代码示例(爪哇7),使用变量theInputStream
和theFileName
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)
它探测内容的前几个字节,并根据该内容而不是文件扩展名返回内容类型。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3190981