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

2022-08-31 15:00:55

是否有任何方便的方法来读取和解析传入请求中的数据。

例如,客户端启动发布请求

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

multipart/form-data默认情况下,3.0 版之前的 Servlet API 确实不支持编码的请求。默认情况下,Servlet API 使用编码解析参数。使用其他编码时,调用将全部返回 。当你已经在Servlet 3.0(Glassfish 3Tomcat 7等)上时,你可以使用HttpServletRequest#getParts()代替。有关扩展示例,另请参阅此博客application/x-www-form-urlencodedrequest.getParameter()null

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


答案 2

解决 方案:

解决方案 A:

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

解决方案 B:

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

解决方案 C:

  1. 下载 http://users.boone.net/wbrameld/multipartformdata/
  2. Invoke getParameter on com.bigfoot.bugar.servlet.http.MultipartFormData

解决方案 D:

使用支柱。Struts 1.1 会自动处理此事。

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


推荐