Подтвердить что ты не робот

Удобный способ анализа входящих параметров 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

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

4b9b3361

Ответ 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
        }
}