Тип контента не такой, как ожидалось при загрузке файла Excel - PullRequest
1 голос
/ 06 марта 2012

У меня есть этот код:

 <h:form id="form" enctype="multipart/form-data">
     <t:inputFileUpload id="eFile" value="#{Parser.uploadFile}" storage="file"/>
     <t:commandButton value="Parse" action="#{Parser.parse}"/>
  </h:form>

И в моем классе Parser:

public class Parser {

    public Parser() {

    }

    public String parse() {
        //it should be 'application/vnd.ms-excel' type 
        //since i'm uploading an excel file saved in MS Excel 2007
        System.err.print(uploadFile.getContentType());
        // but its content-type is 'application/octet-stream'
        return null;

    }

    public UploadedFile getUploadFile() {
        return uploadFile;
    }

    public void setUploadFile(UploadedFile uploadFile) {
        this.uploadFile = uploadFile;
    }
}

В моем проекте везде файлы Excel проверяются в зависимости от его типа контента, они работали отлично некоторое время назад, но теперь я не мог понять, почему они не работают должным образом.

1 Ответ

2 голосов
/ 06 марта 2012

Это вопрос со стороны клиента.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, и проверить, не вызывает ли оно каких-либо исключений при разборе.

...