Игнорировать значение, отправленное браузером. Это действительно зависит от клиентской платформы, браузера и конфигурации.
Если вам нужен полный контроль над типами контента на основе расширения файла, то лучше определить его самостоятельно, используя ServletContext#getMimeType()
.
String mimeType = servletContext.getMimeType(filename);
типов MIME по умолчанию определяемые в web.xml
в servletcontainer в вопросе. Например, Tomcat, он находится в /conf/web.xml
. Вы можете продлить/переопределить его в WebApp-х /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 как надежный. Вы также можете рассмотреть комбинацию обоих подходов. Например. если он возвращает null или application/octet-stream
, используйте другой. Или если оба возвращают другой, но «действительный» тип mimetype, предпочитают тот, который возвращается JMimeMagic.
О, я почти забыл добавить, в JSF вы можете получить ServletContext
следующим образом:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
Или, если вы решили использовать JSF 2.x уже, используйте ExternalContext#getMimeType()
вместо этого.
Хмм ... Я не могу заставить Firefox использовать плохой тип MIME, даже если я испортил свой файл mime.types в системе, поэтому я не уверен, что браузеры могут делать для заголовка Content-type. – Pointy
@Pointy: К сожалению, в мире больше браузеров, чем только FF. Например, разработанная (кашляющая) команда в Редмонде. – BalusC
Да, конечно - как ни странно, я ожидаю, что IE получит неправильный тип MIME, но не таким образом. (Я ожидаю, что он предоставит «application/pdf» для файла JPEG, чье имя, например, было «bogus.pdf»). – Pointy