确定我正在下载的文件的 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 类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章