Ответ 1
Да, заголовок Content-type
в запросе пользовательского агента должен включать multipart/form-data
, как описано в (по крайней мере) спецификации HTML4:
http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
У меня есть сервлет, который используется для разных действий, используемых в шаблоне Front Controller. Кто-нибудь знает, можно ли сказать, являются ли данные, отправленные обратно к нему, 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(), представленный выше, имейте в виду, что:
С учетом этого проверка, которую вы должны запустить, это:
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/")) {
...
}
Вы можете написать его намного короче, используя org.apache.commons.lang3.StringUtils
Apache commons:
if (StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/")) {
...
}
https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getParts()
java.util.Collection getParts()
Броски: ServletException - если этот запрос не имеет тип multipart/form-data