2010-03-11 6 views
7

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

  • Filename
  • Bytes
  • Content-Type, как представленный в браузере.

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

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

+1

Хмм ... Я не могу заставить Firefox использовать плохой тип MIME, даже если я испортил свой файл mime.types в системе, поэтому я не уверен, что браузеры могут делать для заголовка Content-type. – Pointy

+0

@Pointy: К сожалению, в мире больше браузеров, чем только FF. Например, разработанная (кашляющая) команда в Редмонде. – BalusC

+0

Да, конечно - как ни странно, я ожидаю, что IE получит неправильный тип MIME, но не таким образом. (Я ожидаю, что он предоставит «application/pdf» для файла JPEG, чье имя, например, было «bogus.pdf»). – Pointy

ответ

8

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

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

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^