Может ли сервлет определить, являются ли отправленные данные multipart/form-data?
-
09-06-2019 - |
Вопрос
У меня есть сервлет, который используется для множества различных действий, используемых в Шаблон переднего контроллера.Кто-нибудь знает, можно ли определить, являются ли отправленные обратно данные 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(), представленный выше, имейте в виду, что:
- request.getContentType() может возвращать значение null.
- 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».
Не забывайте, что:
request.getContentType() может возвращать значение null.
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