如何获取文件的媒体类型(MIME类型)?

383

如何使用Java从文件获取媒体类型(MIME类型)? 我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确关闭其流。

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


5
提供了一个关于可用库的良好概述,网址为http://www.rgagnon.com/javadetails/java-0487.html。 - koppor
我使用了在这里发布的答案中提到的类:https://dev59.com/HW855IYBdhLWcg3wbjvO#10140531 - Joshua Pinter
4
现在Tika应该是答案了。下面的其他答案忽略了Tika的许多依赖关系,但我在tika-core中没有看到任何依赖项。 - javamonkey79
@javamonkey79 当我们使用TIka时,它会将文件转换为不再可用的格式。String contentType = tika.detect(is)。 - Cool Techie
28个回答

0

在尝试了其他各种库之后,我最终选择了mime-util。

<groupId>eu.medsea.mimeutil</groupId>
      <artifactId>mime-util</artifactId>
      <version>2.1.3</version>
</dependency>

File file = new File("D:/test.tif");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
System.out.println(mimeTypes);

0
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;
}

这个方法Files.probeContentType(String)自JDK 1.7版本起就可用,并且对我来说非常有效。 - Reza Rahimi

0
在Java中,URLConnection类有一个名为guessContentTypeFromName(String fileName)的方法,可以根据文件名猜测文件的MIME媒体类型(也称为内容类型)。该方法使用文件名的扩展名来确定内容类型。
String fileName = "image.jpg";
String contentType = URLConnection.guessContentTypeFromName(fileName);
System.out.println(contentType); // "image/jpeg"

想了解更多,请阅读本文


0

0
如果您想要一种可靠(即一致)的将文件扩展名映射到 MIME 类型的方法,这是我使用的方法:

https://github.com/jjYBdx4IL/misc/blob/master/text-utils/src/main/java/com/github/jjYBdx4IL/utils/text/MimeType.java

它包含了一个捆绑的 mime 类型数据库,并基本上颠倒了 javax.activation 的 MimetypesFileTypeMap 类的逻辑,通过使用数据库来初始化“编程式”条目。这样,库定义的类型始终优先于未捆绑资源中定义的类型。


0
如果你在 Linux 操作系统上工作,有一个命令行 file --mimetype:
String mimetype(file){

   //1. run cmd
   Object cmd=Runtime.getRuntime().exec("file --mime-type "+file);

   //2 get output of cmd , then 
    //3. parse mimetype
    if(output){return output.split(":")[1].trim(); }
    return "";
}

那么

mimetype("/home/nyapp.war") //  'application/zip'

mimetype("/var/www/ggg/au.mp3") //  'audio/mp3'

4
这个方案可以实现,但我认为这是一种不好的做法,因为它将你的代码绑定到特定的操作系统上,并需要在运行该代码的系统上安装外部工具。别误解我的意思;这是一个完全有效的解决方案,但会破坏Java的可移植性——而这是使用Java的主要原因之一... - ToVine
@ToVine:就记录而言,我要尊重地不同意。并非每个Java程序都需要可移植性。让上下文和程序员做出决定。https://en.wikipedia.org/wiki/Java_Native_Interface - EmpathicSage

0
File file = new File(PropertiesReader.FILE_PATH);
MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
String mimeType = fileTypeMap.getContentType(file);
URLConnection uconnection = file.toURL().openConnection();
mimeType = uconnection.getContentType();

4
虽然这段代码可能解决了问题,但是包括一些解释可以帮助提高您发布的内容质量。 - 4b0

-1
我用以下的代码完成了它。
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){

        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接