Удобный способ разбора входящих параметров multipart / form-data в сервлете [дубликат]
этот вопрос уже есть ответ здесь:
- Как загрузить файлы на сервер с помощью JSP / Servlet? 12 ответов
есть ли удобный способ для чтения и анализа данных из входящего запроса.
например, клиент инициирует запрос 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()
. Также смотрите этот блог для расширенных примеров.Prior к servlet 3.0, а де-факто стандартные для разбора
multipart/form-data
запросы будут использовать Apache Commons FileUpload. Просто внимательно прочитайте его Руководство Пользователя и Часто Задаваемые Вопросы разделы, чтобы узнать, как его использовать. Я опубликовал ответ с примером кода раньше здесь (он также содержит пример таргетинга сервлет 3.0).
решения:
Решение A:
- Скачать http://www.servlets.com/cos/index.html
- вызов getParameters () on
com.oreilly.servlet.MultipartRequest
Решение B:
- скачать http://jakarta.Apache.org/commons/fileupload/
- вызвать readHeaders () in
org.apache.commons.fileupload.MultipartStream
Решение C:
- скачать http://users.boone.net/wbrameld/multipartformdata/
- вызвать getParameter on com.снежный человек.багар.сервлет.http.MultipartFormData
Решение D:
Использовать Распорки. Распорки 1.1 обрабатывают это автоматически.
не всегда есть сервлет перед загрузкой (я мог бы использовать фильтр, например). Или может быть, что один и тот же контроллер ( опять же фильтр или также servelt ) может обслуживать много действий, поэтому я думаю, что полагаюсь на эту конфигурацию сервлета, чтобы использовать метод 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 } }