66

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

例如客户端发起发布请求

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

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

4

3 回答 3

80

multipart/form-dataServlet API 3.0 之前的版本默认不支持编码请求。Servlet API 默认使用application/x-www-form-urlencoded编码解析参数。当使用不同的编码时,request.getParameter()调用将全部返回null。当您已经使用 Servlet 3.0(Glassfish 3Tomcat 7等)时,您可以使用它HttpServletRequest#getParts()。另请参阅此博客以获取扩展示例。

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

于 2010-07-26T17:03:10.887 回答
17

解决方案:

解决方案 A:

  1. 下载http://www.servlets.com/cos/index.html
  2. 调用 getParameters()com.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. 在 com.bigfoot.bugar.servlet.http.MultipartFormData 上调用 getParameter

解决方案 D:

使用 Struts。Struts 1.1 会自动处理这个问题。

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

于 2012-03-20T07:03:52.080 回答
7

在上传之前并不总是有一个 servlet(例如,我可以使用过滤器)。或者可能是同一个控制器(同样是一个过滤器或一个 servelt )可以提供许多操作,所以我认为依赖于该 servlet 配置来使用 getPart 方法(仅适用于 Servlet API >= 3.0),我不知道,我不喜欢。

一般来说,我更喜欢独立的解决方案,能够独自生活,在这种情况下 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
        }
}
于 2015-06-09T12:02:47.967 回答