0

我有一个可以下载的文件 URL。它看起来像这样:

 http://<server>/recruitment-mantis/plugin.php?page=BugSynchronizer/getfile&fileID=139&filehash=3e7a52a242f90c23539a17f6db094d86

如何获取此文件的内容类型?我必须管理在这种情况下很简单:

   URL url = new URL(stringUrl);

   URLConnection urlConnection = url.openConnection();
   urlConnection.connect();

   String urlContent = urlConnection.getContentType();

在每个文件中返回我application/force-download的内容类型(无论是 jpg 还是 pdf 文件)。我想这样做是因为我想设置下载文件的扩展名(可以是各种)。如何“绕过”这种application/force-download内容类型?在此先感谢您的帮助。

4

3 回答 3

1

如何“绕过”此应用程序/强制下载内容类型?

我上传的内容类型也有同样的问题。虽然您可以信任来自 URL 的内容类型,但我选择去寻找一个内容类型实用程序来确定来自字节内容的内容。

在尝试了 5 次左右的实现之后,我决定重新发明轮子并发布了我的SimpleMagic 包,它使用了魔法 (5) Unix 内容类型文件来实现与 Unix 文件 (1) 命令相同的功能。它使用内部配置文件,或者可以读取/etc/magic/usr/share/file/magic 或其他 magic(5) 文件并确定来自FileInputStreambyte[].

github 源代码、javadocs 和一些文档的位置可从主页获得。

使用 SimpleMagic,您可以执行以下操作:

ContentInfoUtil util = new ContentInfoUtil();
ContentInfo info = util.findMatch(byteArray);

它根据数据的内容(FileInputStreambyte[])而不是文件名起作用。

于 2013-05-21T18:02:46.517 回答
1

检查urlConnection.getHeaderField("Content-Disposition")文件名。通常该标题用于多部分内容中的附件,但检查并没有什么坏处。

如果该标头不存在,您可以将 URL 保存到临时文件中,并用于probeContentType获取有意义的 MIME 类型:

Path tempFile = Files.createTempFile(null, null);
try (InputStream urlStream = urlConnection.getInputStream()) {
    Files.copy(urlStream, tempFile, StandardCopyOption.REPLACE_EXISTING);
}
String mimeType = Files.probeContentType(tempFile);

请注意,probeContentType如果无法确定文件的类型,可能会返回 null。

于 2013-05-09T11:24:23.200 回答
0

我猜这个内容类型是从您下载的服务器设置的。一些服务器使用这些类型的内容类型来强制浏览器下载文件而不是尝试打开它。例如,当我的服务器返回内容类型“application/pdf”时,chrome 会尝试将其打开为 pdf,但是当服务器返回“application/force-download”时,浏览器会将其保存到磁盘,因为他不知道该怎么做有了这个。

因此,您需要更改服务器以返回正确的内容类型,或者更好地尝试其他一些启发式方法来获取正确的文件类型,因为服务器总是可以通过将其设置为 jpg 而给您一个 exe 来欺骗您。

我看到 Java 7 你可以试试这个方法: http ://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType%28java.nio.file.Path%29

于 2013-05-09T11:18:25.367 回答