Может ли сервлет определить, являются ли опубликованные данные multipart/form-data?

У меня есть сервлет, который используется для разных действий, используемых в шаблоне Front Controller. Кто-нибудь знает, можно ли сказать, являются ли данные, отправленные обратно к нему, enctype = "multipart/form-data"? Я не могу прочитать параметры запроса, пока не решит это, поэтому я не могу отправить запрос правильному контроллеру.

Любые идеи?

Ответ 1

Да, заголовок Content-type в запросе пользовательского агента должен включать multipart/form-data, как описано в (по крайней мере) спецификации HTML4:

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

Ответ 2

Если вы попытаетесь использовать метод request.getContentType(), представленный выше, имейте в виду, что:

  • request.getContentType() может возвращать null.
  • request.getContentType() может быть не равно "multipart/form-data", но может начинаться с него.

С учетом этого проверка, которую вы должны запустить, это:

if (request.getContentType() != null && request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) {
// Multipart logic here
}

Ответ 3

Вы можете вызвать метод для получения типа содержимого.

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getContentType()

Согласно http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2, тип содержимого будет "multipart/form-data".

Не забывайте, что:

  • request.getContentType() может возвращать значение null.

  • request.getContentType() может быть не равно "multipart/form-data", но может начинаться с него.

Итак, имея в виду все это:

if (request.getContentType() != null && 
    request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) 
{
    << code block >>
} 

Ответ 5

Вам нужно будет прочитать параметры запроса, чтобы определить это, по крайней мере, на каком-то уровне. Класс ServletRequest имеет метод getContentType, который вы хотите посмотреть.

Ответ 6

Чтобы расширить ответ awm129 - реализация Apache commons соответствует этому:

if (request != null 
        && request.getContentType() != null 
        && request.getContentType().toLowerCase(Locale.ENGLISH).startsWith("multipart/")) {
    ...
}

Вы можете написать его намного короче, используя org.apache.commons.lang3.StringUtils Apache commons:

if (StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/")) { 
    ... 
}