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

StackOverflow https://stackoverflow.com/questions/66423

Вопрос

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

Есть идеи?

Это было полезно?

Решение

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

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

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

Если вы собираетесь попробовать использовать метод 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
}

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

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 >>
} 

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

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

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

Чтобы расширить ответ 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/")) { 
    ... 
}

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

java.util.Коллекция getParts()

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top