我有一个文件的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内容类型?提前感谢您的帮助。
发布于 2013-05-09 19:24:23
检查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-22 02:02:47
如何“绕过”此应用程序/强制下载内容类型?
我上传的内容类型也有同样的问题。尽管您可以信任URL中的content-type,但我还是选择使用content-type实用程序从字节内容中确定内容。
在尝试了5次左右的实现之后,我决定重新发明轮子,并发布了我的SimpleMagic package,它利用神奇的(5) Unix内容类型文件来实现与Unix file(1)命令相同的功能。它使用内部配置文件,或者可以读取/etc/magic、/usr/share/file/magic或其他魔术(5)文件,并从File、InputStream或byte[]确定文件内容。
github源代码的位置、javadoc和一些文档都可以在主页上找到。
使用SimpleMagic,您可以执行类似以下操作:
ContentInfoUtil util = new ContentInfoUtil();
ContentInfo info = util.findMatch(byteArray);它根据数据的内容(File、InputStream或byte[])工作,而不是文件名。
发布于 2013-05-09 19:18:25
我猜这个内容类型是从你下载的服务器上设置的。一些服务器使用这种内容类型来强制浏览器下载文件,而不是尝试打开它。例如,当我的服务器返回内容类型"application/ pdf“时,chrome会尝试将其作为pdf打开,但当服务器返回"application/force-download”时,浏览器会将其保存到磁盘上,因为他不知道如何处理它。
因此,您需要更改服务器以返回正确的内容类型,或者更好地尝试一些其他启发式方法来获取正确的文件类型,因为服务器可能总是通过将其设置为jpg而给您一个exe来欺骗您。
我看到在Java7中你可以尝试这个方法:http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType%28java.nio.file.Path%29
https://stackoverflow.com/questions/16460306
复制相似问题