Tomahawk UploadedFile # getContentType () возвращает приложение / октет-поток для файлов ZIP

Я использовал Apache MyFaces Tomahawk, чтобы использовать загрузку файлов в проекте JSF. Я успешно получил загруженный файл, однако каждый раз, когда я пытаюсь определить тип файла, особенно для zip-файла, функция getContentType() всегда возвращает application/octet-stream. Почему это так?

Я полагаю, это ошибка конфигурации моего web.xml, вот файл:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <display-name>Project 1</display-name>

    <context-param>
        <param-name>facelets.LIBRARIES</param-name>
        <param-value>/WEB-INF/el-taglib.xml</param-value>
    </context-param>
    <context-param>
        <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name>
        <param-value>true</param-value>
    </context-param>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

    <mime-mapping>
        <extension>zip</extension>
        <mime-type>application/zip</mime-type>
    </mime-mapping>

</web-app>

Может ли кто-нибудь помочь мне?


person Hei    schedule 07.12.2012    source источник


Ответы (1)


Результат _ 1_ установлен не сервером на основе web.xml отображения mime, а самим клиентом прямо в заголовке multipart/form-data перед его отправкой на сервер. Таким образом, он просто извлекается из тела запроса.

Если он не возвращает ожидаемое или желаемое значение, вы всегда можете проверить тип MIME на основе расширения загруженного файла с помощью _ 4_.

String contentType = externalContext.getMimeType(uploadedFile.getName());

Однако имейте в виду, что расширение файла может быть подделано клиентом (как и тип контента в заголовке multipart/form-data!), Поэтому обнаружение на основе расширения (а также извлеченного / определенного типа контента!) Не обязательно достаточно надежно. . Например, клиент мог переименовать foo.exe в foo.zip или около того. Лучший способ определить, действительно ли файл является ZIP-файлом, - просто открыть файл как ZIP-файл и перехватить возникшее исключение. Стандартный Java SE API предлагает _9 _ конструктор для этого.

Предполагая, что вы храните загруженные файлы следующим образом (FilenameUtils и IOUtils взяты из Apache Commons IO, которые у вас уже должны быть, поскольку это одна из необходимых зависимостей Tomahawk):

String prefix = FilenameUtils.getBaseName(uploadedFile.getName()); 
String suffix = FilenameUtils.getExtension(uploadedFile.getName());
File uploadLocation = new File("/path/to/uploads"); // Make it configureable!
File file = File.createTempFile(prefix + "-", "." + suffix, uploadLocation);

InputStream input = uploadedFile.getInputStream();
OutputStream output = new FileOutputStream(file);

try {
    IOUtils.copy(input, output);
} finally {
    IOUtils.closeQuietly(output);
    IOUtils.closeQuietly(input);
}

Затем вы сможете определить, является ли это допустимым ZIP-файлом, следующим образом:

try {
    new ZipFile(file);
} catch (ZipException e) {
    // Here, we know that it's not a valid ZIP file!
}

Смотрите также:

person BalusC    schedule 07.12.2012