一尘不染

Java 在Servlet中解析传入的multipart / form-data参数的简便方法

java

有什么方便的方法可以读取和解析传入请求中的数据。

例如客户发起发布请求

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

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


阅读 2174

收藏
2020-03-07

共1个答案

一尘不染

multipart/form-data实际上,3.0版之前的Servlet API确实默认不支持编码请求。Servlet API默认使用application/x-www-form-urlencoded编码来解析参数。当使用其他编码时,request.getParameter()所有调用都将返回null。如果你已经在使用Servlet 3.0(Glassfish 3,Tomcat 7等),则可以HttpServletRequest#getParts()改用。另请参阅此博客以获取更多示例。

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

2020-03-07