有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (3) 个答案

  1. # 1 楼答案

    上传之前并不总是有servlet(例如,我可以使用过滤器)。 或者可能是同一个控制器(同样是一个过滤器或servelt)可以服务于许多操作,所以我认为依靠servlet配置来使用getPart方法(仅适用于ServletAPI>;=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
            }
    }
    
  2. # 2 楼答案

    默认情况下,版本3.0之前的Servlet API不支持multipart/form-data编码的请求。Servlet API默认使用application/x-www-form-urlencoded编码解析参数。当使用不同的编码时,request.getParameter()调用将全部返回null。当您已经使用Servlet3.0(Glassfish 3Tomcat 7等)时,可以使用^{}。有关扩展示例,请参见this blog

    在Servlet3.0之前,解析multipart/form-data请求的de facto标准将使用Apache Commons FileUpload。只要仔细阅读它的用户指南常见问题部分,就可以了解如何使用它。我在here之前发布了一个带有代码示例的答案(它还包含一个针对Servlet 3.0的示例)

  3. # 3 楼答案

    解决方案:

    解决方案A:

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

    解决方案B:

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

    解决方案C:

    1. 下载http://users.boone.net/wbrameld/multipartformdata/
    2. 在上调用getParameter 通用域名格式。大脚怪。布加。servlet。http。多部件数据

    解决方案D:

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

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