Это вопрос со стороны клиента.UploadedFile#getContentType()
возвращает все, что клиент отправил в поле заголовка Content-Type
части multipart / form-data.Очевидно, у рассматриваемого клиента нет типа mime, связанного с расширением загружаемого файла.Это может произойти, если на клиенте не установлен MS Excel.
Вы, как сервер, также можете определить тип mime на основе расширения файла по ExternalContext#getMimeType()
или когдавы все еще на древнем JSF 1.x, ServletContext#getMimeType()
.
String filename = FilenameUtils.getName(uploadedFile.getName()); // This is available by Commons IO which you should already have.
String mimetype = FacesContext.getCurrentInstance().getExternalContext().getMimeType(filename);
// ...
Информация о MIME-типе получается из <mime-mapping>
записей в web.xml
.Контейнер сервлета содержит целый список в своем собственном по умолчанию web.xml
(в случае, например, Tomcat, вы можете найти его в папке /conf
).Вы можете расширить / переопределить его в собственном web.xml
своего веб-приложения следующим образом для XLSX:
<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>
Обратите внимание, что это обнаружение основано исключительно на расширении файла, а не на его содержимом.Таким образом, это не предотвращает неправильное обнаружение, когда клиент отредактировал расширение файла.Наиболее надежным было бы проанализировать его с помощью реального анализатора файлов Excel, такого как Apache POI или JExcelAPI, и проверить, не вызывает ли оно каких-либо исключений при разборе.