Wygodny sposób parsowania przychodzących parametrów multipart / form-data w Serwlecie [duplikat]

To pytanie ma już odpowiedź tutaj:

Czy istnieje wygodny sposób odczytu i analizy danych z przychodzącego żądania.

E. g client initiate POST request

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

Nie jestem w stanie uzyskać param używając request.getParameter("paramName"). Następujący kod

BufferedReader reader = new BufferedReader(new InputStreamReader(
    request.getInputStream()));
  StringBuilder sb = new StringBuilder();
  for (String line; (line = reader.readLine()) != null;) {
   System.out.println(line);

  }

Jednak wyświetla content for me

-----------------------------29772313742745
Content-Disposition: form-data; name="name"
J.Doe
-----------------------------29772313742745
Content-Disposition: form-data; name="email"
[email protected]
-----------------------------29772313742745

Jaki jest najlepszy sposób na analizę przychodzącego żądania? Nie chcę pisać własnego parsera, prawdopodobnie jest gotowe rozwiązanie.

Author: BalusC, 2010-07-26

3 answers

multipart/form-data zakodowane żądania nie są domyślnie obsługiwane przez API Servlet przed wersją 3.0. Interfejs API Servlet domyślnie przetwarza parametry za pomocą kodowania application/x-www-form-urlencoded. Przy użyciu innego kodowania, wszystkie wywołania request.getParameter() zwrócą null. Gdy jesteś już na Servlet 3.0 (Glassfish 3, Tomcat 7 , itp.), wtedy można użyć HttpServletRequest#getParts() zamiast tego. Zobacz również ten blog dla rozszerzonych przykładów.

Przed Servletem 3.0, A de facto standard do parse multipart/form-data requests would be using Apache Commons FileUpload . Wystarczy uważnie przeczytać jego Podręcznik użytkownika i Często zadawane pytania sekcje, aby dowiedzieć się, jak z niego korzystać. Napisałem odpowiedź z przykładem kodu przed tutaj (zawiera również przykład kierowania Servlet 3.0).

 74
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:08

Rozwiązania:

Rozwiązanie A:

  1. Pobierz http://www.servlets.com/cos/index.html
  2. Invoke getParameters () on com.oreilly.servlet.MultipartRequest

Roztwór B:

  1. Pobierz http://jakarta.Apache.org/commons/fileupload /
  2. Invoke readHeaders () in org.apache.commons.fileupload.MultipartStream

Roztwór C:

  1. Pobierz http://users.boone.net/wbrameld/multipartformdata /
  2. wywołaj getParameter na com.Wielka Stopa.bugar.servlet.http.MultipartFormData

Rozwiązanie D:

Użyj Rozpórek. Struts 1.1 obsługuje to automatycznie.

Numer referencyjny: http://www.jguru.com/faq/view.jsp?EID=1045507

 16
Author: renura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-31 14:31:31

Nie zawsze jest servlet przed uploadem (przydałby mi się np. filtr). Albo może być tak, że ten sam kontroler (znowu filtr lub też servelt ) może obsłużyć wiele akcji, więc myślę, że to na tej konfiguracji servleta można użyć metody getPart (tylko dla API Servlet >= 3.0), Nie wiem, nie lubię.

Ogólnie wolę niezależne rozwiązania, potrafiące żyć samotnie, a w tym przypadku http://commons.apache.org/proper/commons-fileupload / jest jednym z nich.

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
        }
}
 4
Author: Luca Rasconi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 20:44:12