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

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

Есть идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
14 865
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

Вы можете вызвать метод, чтобы получить тип контента.

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".

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

  1. request.getContentType () может возвращать null.

  2. request.getContentType () может не совпадать с multipart / form-data, но может просто начинаться с него.

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

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

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

Darren Hicks 13.04.2014 08:30

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

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

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

Имея это в виду, вам следует выполнить следующую проверку:

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

ServletFileUpload реализует isMultipartContent (). Возможно, вы сможете поднять эту реализацию (в отличие от накладных расходов на создание ServletFileUpload) для своих нужд.

http://www.docjar.com/html/api/org/apache/commons/fileupload/servlet/ServletFileUpload.java.html

https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getParts ()

java.util.Collection getParts ()

Броски: ServletException - если этот запрос не относится к типу multipart / form-data

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

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/")) { 
    ... 
}

Другие вопросы по теме