Когда браузеры отправляют application / octet-stream как Content-Type? - PullRequest
8 голосов
/ 11 марта 2010

Я разрабатываю загрузку файлов с помощью JSF. Приложение сохраняет в файле три даты:

  • Имя файла
  • Б
  • Content-Type, предоставленный браузером.

Моя проблема в том, что некоторые файлы сохраняются с типом содержимого = application/octet-stream, даже если они *.doc файлы или *.pdf.

Когда браузер отправляет такой тип контента?
Я хочу очистить базу данных, чтобы знать, когда информация браузера неверна.

Ответы [ 2 ]

8 голосов
/ 11 марта 2010

Игнорировать значение, отправленное браузером. Это действительно зависит от клиентской платформы, используемого браузера и конфигурации.

Если вы хотите получить полный контроль над типами контента на основе расширения файла, лучше определите его самостоятельно, используя ServletContext#getMimeType().

String mimeType = servletContext.getMimeType(filename);

Типы пантомимы по умолчанию определены в web.xml рассматриваемого сервлет-контейнера. Например, Tomcat находится в /conf/web.xml. Вы можете расширить / переопределить его в /WEB-INF/web.xml веб-приложения следующим образом:

<mime-mapping>
    <extension>xlsx</extension>
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>

Вы также можете определить тип пантомимы на основе фактического содержимого файла (поскольку расширение файла само по себе может быть неточным, его может обмануть клиент), но это большая работа. Подумайте об использовании сторонней библиотеки, чтобы сделать всю работу. Я нашел JMimeMagic полезным для этого. Вы можете использовать его следующим образом:

String mimeType = Magic.getMagicMatch(file, false).getMimeType();

Обратите внимание, что он не поддерживает все mimetypes как надежные. Вы также можете рассмотреть комбинацию обоих подходов. Например. если один возвращает ноль или application/octet-stream, используйте другой. Или, если оба возвращают другой, но «действительный» mimetype, предпочтите тот, который возвращен JMimeMagic.

О, я почти забыл добавить, в JSF вы можете получить ServletContext следующим образом:

ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();

Или, если вы уже используете JSF 2.x, используйте ExternalContext#getMimeType().

2 голосов
/ 11 марта 2010

Это зависит от ОС, браузера и того, как пользователь их настроил. Он основан на том, как браузер определяет тип файлов локальных файлов (для их отображения). На большинстве комбинаций ОС / браузера это основано на расширении файла, но на некоторых это может быть определено другими способами. (например: в Mac OS)

В любом случае вам не следует полагаться на тип контента, отправляемый браузером. Наилучшим подходом было бы на самом деле посмотреть содержимое файла. Возможно, вы могли бы также использовать имя файла, но имейте в виду, что браузеры не обязательно будут хороши в том, чтобы сообщать вам об этом (хотя это, вероятно, все еще на лот более надежно, чем тип контента, который они отправляют) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...