如何使用Java从文件中获得媒体类型(MIME类型)?到目前为止,我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确地关闭它的流。
您将如何探测该文件以确定其实际类型(而不仅仅是基于扩展名)?
如何使用Java从文件中获得媒体类型(MIME类型)?到目前为止,我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确地关闭它的流。
您将如何探测该文件以确定其实际类型(而不仅仅是基于扩展名)?
当前回答
Apache Tika在Tika -core中提供了基于流前缀中的魔法标记的mime类型检测。tika-core不获取其他依赖项,这使得它像目前未维护的Mime类型检测实用程序一样轻量级。
简单的代码示例(Java 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();
}
请注意,meditype .detect(…)不能直接使用(TIKA-1120)。更多提示请访问https://tika.apache.org/1.24/detection.html。
其他回答
如果你正在使用Servlet并且Servlet上下文对你可用,你可以使用:
getServletContext().getMimeType( fileName );
不幸的是,
mimeType = file.toURL().openConnection().getContentType();
不工作,因为URL的这种使用会使文件被锁定,因此,例如,它是不可删除的。
然而,你有这个:
mimeType= URLConnection.guessContentTypeFromName(file.getName());
还有下面的内容,它的优点不仅仅是使用文件扩展名,还可以查看内容
InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream
然而,正如上面的评论所建议的那样,mime-types的内置表是非常有限的,例如,不包括MSWord和PDF。因此,如果您想要泛化,您将需要使用内置库,例如Mime-Util(这是一个很棒的库,同时使用文件扩展名和内容)。
如果你是一个Android开发人员,你可以使用一个工具类Android .webkit. mimetypemap,它将mime类型映射到文件扩展名,反之亦然。下面的代码片段可能对您有所帮助。 getMimeType(String fileUrl) { 字符串扩展= MimeTypeMap.getFileExtensionFromUrl(fileUrl); 返回MimeTypeMap.getSingleton () .getMimeTypeFromExtension(扩展); }
只需一行即可:MimetypesFileTypeMap()。getContentType(新文件(“请”))。查看完整的测试代码(Java 7):
import java.io.File;
import javax.activation.MimetypesFileTypeMap;
public class MimeTest {
public static void main(String a[]){
System.out.println(new MimetypesFileTypeMap().getContentType(
new File("/path/filename.txt")));
}
}
这段代码产生以下输出:文本/纯文本
如果你被java 5-6所困,那么这个实用程序类来自servy开源产品。
你只需要这个函数
public static String getContentType(byte[] data, String name)
它探测内容的第一个字节,并根据该内容而不是文件扩展名返回内容类型。