在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:
- 下载http://www.servlets.com/cos/index.html
- 在
com.oreilly.servlet.MultipartRequest
上调用getParameters()
解决schemeB:
- 下载http://jakarta.Apache.org/commons/fileupload/
- 调用
org.apache.commons.fileupload.MultipartStream
readHeaders()
解决schemeC:
- 下载http://users.boone.net/wbrameld/multipartformdata/
- 在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 } }