Удобный способ разбора входящих параметров 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"
abuse@spamcop.com
-----------------------------29772313742745
Как лучше всего проанализировать входящий запрос? Я не хочу писать свой собственный парсер, возможно, есть готовое решение.
3 ответа
multipart/form-data
закодированные запросы действительно не поддерживаются Servlet API до версии 3.0. Servlet API анализирует параметры по умолчанию, используя application/x-www-form-urlencoded
кодирование. При использовании другой кодировки request.getParameter()
звонки все вернутся null
, Если вы уже используете Servlet 3.0 ( Glassfish 3, Tomcat 7 и т. Д.), Вы можете использовать HttpServletRequest#getParts()
вместо. Также смотрите этот блог для расширенных примеров.
До Servlet 3.0, де-факто стандарт для разбора multipart/form-data
запросы будут использовать Apache Commons FileUpload. Просто внимательно прочитайте разделы " Руководство пользователя" и " Часто задаваемые вопросы", чтобы узнать, как его использовать. Ранее я опубликовал ответ с примером кода (он также содержит пример, ориентированный на Servlet 3.0).
Решения:
Решение А:
- Скачать http://www.servlets.com/cos/index.html
- Вызвать getParameters() на
com.oreilly.servlet.MultipartRequest
Решение Б:
- Скачать http://jakarta.apache.org/commons/fileupload/
- Вызовите readHeaders() в
org.apache.commons.fileupload.MultipartStream
Решение C:
- Загрузить http://users.boone.net/wbrameld/multipartformdata/
- Вызовите getParameter для com.bigfoot.bugar.servlet.http.MultipartFormData
Решение D:
Используйте Struts. Struts 1.1 обрабатывает это автоматически.
Не всегда есть сервлет перед загрузкой (я мог бы использовать фильтр, например). Или может быть так, что один и тот же контроллер (опять же фильтр или также сервлет) может обслуживать много действий, поэтому я думаю, что использование этой конфигурации сервлета для использования метода 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
}
}