Удобный способ анализа входящих параметров multipart / form-data в Servlet

Есть ли удобный способ читать и анализировать данные из входящего запроса.

Например, запрос на отправку клиента

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 

Каков наилучший способ анализа входящего запроса? Я не хочу писать свой собственный парсер, возможно, есть готовое решение.

Кодированные запросы multipart/form-data действительно не поддерживаются по умолчанию API Servlet до версии 3.0. API Servlet анализирует параметры по умолчанию с application/x-www-form-urlencoded кодировки 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).

Решения:

Решение A:

  1. Загрузите http://www.servlets.com/cos/index.html
  2. Вызовите getParameters () на com.oreilly.servlet.MultipartRequest

Решение B:

  1. Загрузите http://jakarta.Apache.org/commons/fileupload/
  2. Вызывать readHeaders () в org.apache.commons.fileupload.MultipartStream

Решение C:

  1. Загрузите http://users.boone.net/wbrameld/multipartformdata/
  2. Вызовите getParameter на com.bigfoot.bugar.servlet.http.MultipartFormData

Решение D:

Используйте Struts. Struts 1.1 обрабатывает это автоматически.

Ссылка: http://www.jguru.com/faq/view.jsp?EID=1045507

Не всегда есть сервлет перед загрузкой (я мог бы использовать фильтр, например). Или может быть, что один и тот же controller (опять-таки фильтр или сервлета) может выполнять множество действий, поэтому я думаю, что полагаться на эту конфигурацию сервлета использовать метод getPart (только для Servlet API> = 3.0), я не знаю , Я не люблю.

В общем, я предпочитаю независимые решения, способные жить в одиночку, и в этом случае http://commons.apache.org/proper/commons-fileupload/ является одним из них.

 List 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 } } 
Давайте будем гением компьютера.