Удобный способ анализа входящих параметров multipart/form-data в сервлете
Есть ли удобный способ для чтения и анализа данных из входящего запроса.
Например, клиентский запрос на отправку сообщений
URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
PrintWriter writer = null;
try {
OutputStream output = connection.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!
// Send normal param.
writer.println("--" + boundary);
writer.println("Content-Disposition: form-data; name=\"param\"");
writer.println("Content-Type: text/plain; charset=" + charset);
writer.println();
writer.println(param);
Мне не удалось получить параметр с помощью request.getParameter("paramName")
. Следующий код
BufferedReader reader = new BufferedReader(new InputStreamReader(
request.getInputStream()));
StringBuilder sb = new StringBuilder();
for (String line; (line = reader.readLine()) != null;) {
System.out.println(line);
}
однако отображает содержимое для меня
-----------------------------29772313742745
Content-Disposition: form-data; name="name"
J.Doe
-----------------------------29772313742745
Content-Disposition: form-data; name="email"
[email protected]
-----------------------------29772313742745
Каков наилучший способ анализа входящего запроса? Я не хочу писать собственный парсер, возможно, есть готовое решение.
Ответы
Ответ 1
multipart/form-data
закодированные запросы по умолчанию не поддерживаются API Servlet до версии 3.0. API-интерфейс Servlet анализирует параметры по умолчанию с использованием кодировки application/x-www-form-urlencoded
. При использовании другого кодирования вызовы request.getParameter()
все возвращают null
. Когда вы уже на Servlet 3.0 (Glassfish 3, Tomcat 7 и т.д.), вы можете вместо этого использовать HttpServletRequest#getParts()
. Также см. этот блог для расширенных примеров.
До сервлета 3.0 de facto для синтаксического анализа запросов multipart/form-data
будет использоваться Apache Commons FileUpload. Просто внимательно прочитайте разделы "Руководство пользователя" и "Часто задаваемые вопросы", чтобы узнать, как его использовать. Я отправил ответ с примером кода перед здесь (он также содержит пример таргетинга на Servlet 3.0).
Ответ 2
Решения:
Решение A:
Решение B:
Решение C:
Решение D:
Используйте Struts. Struts 1.1 обрабатывает это автоматически.
Ссылка: http://www.jguru.com/faq/view.jsp?EID=1045507
Ответ 3
Не всегда есть сервлет перед загрузкой (например, я мог бы использовать фильтр).
Или может быть, что один и тот же контроллер (опять-таки фильтр или сервлета) может выполнять множество действий, поэтому я думаю, что полагаться на эту конфигурацию сервлета использовать метод getPart (только для Servlet API >= 3.0), я не знаю, Я не люблю.
В целом я предпочитаю независимые решения, способные жить в одиночку, и в этом случае http://commons.apache.org/proper/commons-fileupload/ является одним из них.
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : multiparts) {
if (!item.isFormField()) {
//your operations on file
} else {
String name = item.getFieldName();
String value = item.getString();
//you operations on paramters
}
}