如何使用Java从文件中获得媒体类型(MIME类型)?到目前为止,我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确地关闭它的流。

您将如何探测该文件以确定其实际类型(而不仅仅是基于扩展名)?


当前回答

用我的5分钱凑钱:

TL,博士

我使用MimetypesFileTypeMap,并添加任何mime,不存在,我特别需要它,到mime。类型文件。

现在,长长的一段是:

首先,MIME类型列表是巨大的,请看这里:https://www.iana.org/assignments/media-types/media-types.xhtml

我喜欢首先使用JDK提供的标准工具,如果这不起作用,我将去寻找其他工具。

根据文件扩展名确定文件类型

从1.6开始,Java就有了MimetypesFileTypeMap,正如上面的答案之一所指出的,它是确定mime类型的最简单方法:

new MimetypesFileTypeMap().getContentType( fileName );

在它的香草实现中,这并没有做太多(即它适用于。html,但不适用于。png)。然而,添加任何你可能需要的内容类型是超级简单的:

创建名为'mime '的文件。在项目的META-INF文件夹中 为你需要的每一种mime类型添加一行,默认实现没有提供(有数百种mime类型,并且列表会随着时间的推移而增长)。

png和js文件的示例条目如下:

image/png png PNG
application/javascript js

哑剧演员。类型文件格式,查看更多详细信息:https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html

根据文件内容确定文件类型

从1.7开始,Java有Java .nio.file.spi。FileTypeDetector,它定义了一个标准API,用于以特定于实现的方式确定文件类型。

为了获取文件的mime类型,你可以简单地使用Files并在你的代码中这样做:

Files.probeContentType(Paths.get("either file name or full path goes here"));

API定义提供了支持从文件名或文件内容(魔术字节)确定文件mime类型的工具。这就是为什么probeContentType()方法抛出IOException,以防该API的实现使用提供给它的Path来实际尝试打开与它相关的文件。

同样,此功能的普通实现(JDK附带的实现)还有很多需要改进的地方。

在遥远的银河系中的某个理想世界中,所有试图解决文件到mime类型问题的库都将简单地实现java.nio.file.spi。filettypedetector,您可以将首选实现库的jar文件放到类路径中,这就是它了。

在现实世界中,当你需要TL和DR部分时,你应该找到在它的名字旁边有最多星星的库并使用它。对于这个特定的情况,我不需要(还;))。

其他回答

我用下面的代码做到了。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MimeFileType {

    public static void main(String args[]){

        try{
            URL url = new URL ("https://www.url.com.pdf");

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            InputStream content = (InputStream)connection.getInputStream();
            connection.getHeaderField("Content-Type");

            System.out.println("Content-Type "+ connection.getHeaderField("Content-Type"));

            BufferedReader in = new BufferedReader (new InputStreamReader(content));

        }catch (Exception e){

        }
    }
}
public String getFileContentType(String fileName) {
    String fileType = "Undetermined";
    final File file = new File(fileName);
    try
    {
        fileType = Files.probeContentType(file.toPath());
    }
    catch (IOException ioException)
    {
        System.out.println(
                "ERROR: Unable to determine file type for " + fileName
                        + " due to exception " + ioException);
    }
    return fileType;
}

我尝试了几种方法,包括@约书亚·福克斯说的第一个方法。但有些人无法识别PDF文件等常见的mime类型,而另一些人则无法信任假文件(我尝试使用扩展名为TIF的RAR文件)。我发现的解决方案,正如@Joshua Fox以一种肤浅的方式说的,是使用MimeUtil2,像这样:

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

只需一行即可: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")));
    }
}

这段代码产生以下输出:文本/纯文本

JAF API是JDK 6的一部分。看看javax。激活包。

最有趣的类是javax.activation.MimeType -一个实际的MIME类型holder -和javax.activation.MimetypesFileTypeMap -类,其实例可以将文件的MIME类型解析为字符串:

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);