确定我正在下载的文件的 MIME 类型 [重复]

Posted

技术标签:

【中文标题】确定我正在下载的文件的 MIME 类型 [重复]【英文标题】:Determining MIME type of the file I'm downloading [duplicate] 【发布时间】:2013-02-20 18:02:08 【问题描述】:

我正在尝试使用以下代码下载文件。我需要确定正在下载的文件的文件名和 mime 类型。我从中下载的 URL 不包含文件名。我查看了与下面使用的缓冲流有关的方法,但没有看到任何方法可以做到这一点。

    con = (HttpURLConnection) url.openConnection();

    //authenticate this request
    if (passwordAuthentication != null) 
        String auth = passwordAuthentication.getUserName()+":"+passwordAuthentication.getPassword();
        con.setRequestProperty("Authentication", Base64.encodeBase64(auth.getBytes()).toString());
    

    BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName()));
    while ((i = bis.read()) != -1) 
        bos.write(i);
    
    bos.flush();
    bis.close();

我知道我可以通过String contentType = con.getHeaderField("Content-Type"); 获取它,但返回的是text/html,而不是正在下载的实际文件的 ContentType。

编辑:这不是重复的问题,其他方法不提供解决方案,如下所述。

我现在尝试保存不带文件扩展名的文件并使用MagicMatch match = Magic.getMagicMatch(file, true);,但它返回text/plain。我猜那是因为我保存它时没有文件扩展名。

【问题讨论】:

@Perception 唯一的区别是我需要通过一个身份验证层才能确定 MIME 类型。 您可能想试一试 JMimeMagic 库。它可以从底层字节流中探测内容类型(即,即使文件扩展名、内容类型丢失)。我不能保证它的检测率,但它肯定高于 URLConnections 探测方法。 【参考方案1】:

在 Java 7 中,您现在可以使用 Files.probeContentType(path)

【讨论】:

嗯,这里的诀窍是我正在下载的文件位于 URL 上。这也是一个经过身份验证的请求。因此,它需要用户名/密码才能访问目标 URL 上的文件。我还必须有一个文件名才能下载文件。这意味着我必须已经定义了一个文件扩展名:-\ 你也可以试试URLConnection.guessContentTypeFromStream(InputStream)。该方法直接检查输入流的内容。

以上是关于确定我正在下载的文件的 MIME 类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java 中的 MIME 类型确定适当的文件扩展名

查看下载文件应用程序的mime类型

下载文件的 MIME 类型

尝试从 azure blob 下载文件,mime 类型问题

在 C# 中找出确切的文件类型 [重复]

MIME 应用程序/下载