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

этот вопрос уже есть ответ здесь:

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

E. G клиент инициировать post запрос

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);

Я не могу получить 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 закодированные запросы действительно не поддерживаются по умолчанию API сервлета до версии 3.0. API сервлета анализирует параметры по умолчанию с помощью application/x-www-form-urlencoded кодировка. При использовании другой кодировки,request.getParameter() вызовы все вернуть null. Когда вы уже на сервлете 3.0 (сервер приложений GlassFish 3, Tomcat 7 и т. д.), то вы можете использовать HttpServletRequest#getParts(). Также смотрите этот блог для расширенных примеров.

до к servlet 3.0, а де-факто стандартные для разбора multipart/form-data запросы будут использовать Апач Викискладе Fileupload С. Просто внимательно прочитайте его Руководство Пользователя и Часто Задаваемые Вопросы разделы, чтобы узнать, как его использовать. Я опубликовал ответ с примером кода до здесь (он также содержит пример сервлета таргетинга 3.0).


решения:

Решение A:

  1. скачать http://www.servlets.com/cos/index.html
  2. вызов getParameters () on 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 on com.снежный человек.Бугар.сервлет.http.MultipartFormData

Решение D:

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

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


не всегда есть сервлет перед загрузкой (я мог бы использовать фильтр, например). Или может быть, что тот же контроллер ( опять же фильтр или также servelt ) может обслуживать много действий, поэтому я думаю, что полагаться на эту конфигурацию сервлета для использования метода getPart (только для 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
        }
}