我有一个可以下载文件的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
内容类型?在此先感谢您的帮助。
答案 0 :(得分: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
无法确定文件类型,则{{1}}可能会返回null。
答案 1 :(得分:1)
如何'绕过'此应用程序/强制下载内容类型?
我上传的内容类型遇到了同样的问题。虽然您可以信任URL中的内容类型,但我选择寻找内容类型实用程序来确定字节内容中的内容。
在尝试了5个左右的实现之后,我决定重新发明轮子并释放我的SimpleMagic package,它使用魔法(5)Unix内容类型文件来实现与Unix文件(1)命令相同的功能。它使用内部配置文件或可以阅读/etc/magic
,/usr/share/file/magi
c或其他magic(5)文件,并确定来自File
,InputStream
或{{1}的文件内容}}
主页上提供了github源,javadoc和一些文档的位置。
使用SimpleMagic,您可以执行以下操作:
byte[]
它适用于数据的内容(ContentInfoUtil util = new ContentInfoUtil();
ContentInfo info = util.findMatch(byteArray);
,File
或InputStream
),而不是文件名。
答案 2 :(得分: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