Wygodny sposób parsowania przychodzących parametrów multipart / form-data w Serwlecie [duplikat]
To pytanie ma już odpowiedź tutaj:
- Jak wgrać pliki na serwer używając JSP / Servlet? 12 odpowiedzi
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.
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).
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:
- Pobierz http://www.servlets.com/cos/index.html
- Invoke getParameters () on
com.oreilly.servlet.MultipartRequest
Roztwór B:
- Pobierz http://jakarta.Apache.org/commons/fileupload /
- Invoke readHeaders () in
org.apache.commons.fileupload.MultipartStream
Roztwór C:
- Pobierz http://users.boone.net/wbrameld/multipartformdata /
- 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
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
}
}
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