java是在Servlet中解析传入的多部分/formdata参数的便捷方法
是否有任何方便的方法从传入的请求中读取和解析数据
例如,客户端发起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);
我无法使用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
解析传入请求的最佳方法是什么?我不想编写自己的解析器,可能有现成的解决方案
# 1 楼答案
上传之前并不总是有servlet(例如,我可以使用过滤器)。 或者可能是同一个控制器(同样是一个过滤器或servelt)可以服务于许多操作,所以我认为依靠servlet配置来使用getPart方法(仅适用于ServletAPI>;=3.0),我不知道,我不喜欢
一般来说,我更喜欢独立的解决方案,能够独自生活,在这种情况下http://commons.apache.org/proper/commons-fileupload/就是其中之一
# 2 楼答案
默认情况下,版本3.0之前的Servlet API不支持} 。有关扩展示例,请参见this blog
multipart/form-data
编码的请求。Servlet API默认使用application/x-www-form-urlencoded
编码解析参数。当使用不同的编码时,request.getParameter()
调用将全部返回null
。当您已经使用Servlet3.0(Glassfish 3、Tomcat 7等)时,可以使用^{在Servlet3.0之前,解析
multipart/form-data
请求的de facto标准将使用Apache Commons FileUpload。只要仔细阅读它的用户指南和常见问题部分,就可以了解如何使用它。我在here之前发布了一个带有代码示例的答案(它还包含一个针对Servlet 3.0的示例)# 3 楼答案
解决方案:
解决方案A:
com.oreilly.servlet.MultipartRequest
上调用getParameters()解决方案B:
org.apache.commons.fileupload.MultipartStream
解决方案C:
解决方案D:
使用Struts。Struts 1.1会自动处理这个问题
参考:http://www.jguru.com/faq/view.jsp?EID=1045507