Метод getContentType всегда возвращает "application/force-download"
У меня есть 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
Тип содержимого? Заранее спасибо за помощь.
3 ответа
Проверьте 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
может вернуть ноль, если не может определить тип файла.
Как "обойти" этот тип контента приложения / принудительной загрузки?
У меня была такая же проблема с моим загруженным типом контента. Хотя вы можете доверять типу контента из URL, я решил поискать утилиты типа контента, чтобы определить контент из байтового контента.
Попробовав 5 или около того реализаций, я решил заново изобрести колесо и выпустил свой пакет SimpleMagic, который использует магические (5) файлы типа контента Unix для реализации той же функциональности, что и команда Unix file(1). Он использует либо внутренние файлы конфигурации или может читать /etc/magic
, /usr/share/file/magi
c или другие магические (5) файлы и определяют содержимое файла из File
, InputStream
, или же byte[]
,
Расположение источников github, javadocs и некоторая документация доступны на домашней странице.
С SimpleMagic вы делаете что-то вроде следующего:
ContentInfoUtil util = new ContentInfoUtil();
ContentInfo info = util.findMatch(byteArray);
Работает от содержания данных (File
, InputStream
, или же byte[]
), а не имя файла.
Я предполагаю, что этот тип контента установлен с сервера, с которого вы скачиваете. Некоторые серверы используют этот тип контента, чтобы браузеры загружали файл, а не пытались его открыть. Например, когда мой сервер возвращает тип контента "application / pdf", chrome попытается открыть его как pdf, но когда сервер вернет "application / force-download", браузер сохранит его на диск, потому что он понятия не имеет, что делать с этим.
Поэтому вам нужно изменить сервер, чтобы он возвращал правильный тип контента, или лучше использовать другую эвристику, чтобы получить правильный тип файла, потому что сервер всегда может обмануть вас, установив его в jpg, но предоставив вам exe.
Я вижу, с Java 7 вы можете попробовать этот метод: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html