Метод 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/magic или другие магические (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

Другие вопросы по тегам