在Servlet中parsing传入的多部分/表单数据参数的方便方法

是否有任何方便的方式来读取和parsing来自请求的数据。

例如,客户发起发布请求

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" abuse@spamcop.com -----------------------------29772313742745 

parsing传入请求的最佳方法是什么? 我不想写我自己的parsing器,可能有一个现成的解决scheme。

在V3.0之前, multipart/form-data编码的请求确实不是默认支持的Servlet API。 Servlet API默认使用application/x-www-form-urlencoded编码parsing参数。 当使用不同的编码时, request.getParameter()调用将全部返回null 。 当你已经在Servlet 3.0( GlassFish 3 , Tomcat 7等)上,那么你可以使用HttpServletRequest#getParts()来代替。 另请参阅此博客的扩展示例。

在Servlet 3.0之前,parsingmultipart/form-data请求的事实标准是使用Apache Commons FileUpload 。 请仔细阅读其“ 用户指南”和“ 常见问题”部分,以了解如何使用它。 我已经在这里发布了一个代码示例的答案(它也包含一个针对Servlet 3.0的示例)。

解决scheme:

答案A:

  1. 下载http://www.servlets.com/cos/index.html
  2. com.oreilly.servlet.MultipartRequest上调用getParameters()

解决schemeB:

  1. 下载http://jakarta.Apache.org/commons/fileupload/
  2. 调用org.apache.commons.fileupload.MultipartStream readHeaders()

解决schemeC:

  1. 下载http://users.boone.net/wbrameld/multipartformdata/
  2. 在com.bigfoot.bugar.servlet.http.MultipartFormData上调用getParameter

解决schemeD:

使用Struts。 Struts 1.1自动处理。

参考: http : //www.jguru.com/faq/view.jsp? EID= 1045507

上传之前并不总是有一个servlet(例如,我可以使用一个filter)。 或者可能是同一个控制器(又是一个filter或一个servelt)可以提供很多操作,所以我认为依靠这个servletconfiguration来使用getPart方法(仅适用于Servlet API> = 3.0),我不知道,我不喜欢。

一般来说,我更喜欢独立的解决scheme,能够独立生活,在这种情况下, 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 } }