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

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

Есть идеи?

Ответы [ 7 ]

18 голосов
/ 24 февраля 2009

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

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

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

if (request.getContentType() != null && request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) {
// Multipart logic here
}
16 голосов
/ 16 сентября 2008

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

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

8 голосов
/ 16 сентября 2008

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

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 () может возвращать ноль.

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

Итак, учитывая все это:

if (request.getContentType() != null && 
    request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) 
{
    << code block >>
} 
3 голосов
/ 10 августа 2011

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

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

1 голос
/ 16 сентября 2008

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

0 голосов
/ 05 июня 2019

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

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

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

if (StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/")) { 
    ... 
}
0 голосов
/ 11 января 2019

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

java.util.Collection getParts ()

Выдает: ServletException - если этот запрос не имеет тип multipart / form-data

...