Игнорировать значение, отправленное браузером. Это действительно зависит от клиентской платформы, используемого браузера и конфигурации.
Если вы хотите получить полный контроль над типами контента на основе расширения файла, лучше определите его самостоятельно, используя 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()
.