方便的方法来分析在Servlet传入的multipart / form-data的参数[复制]方便的

2019-05-10 21:10发布

这个问题已经在这里有一个答案:

  • 如何使用JSP / Servlet来上传文件到服务器? 12个回答

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

例如,客户端发起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);

我不能用得到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

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

Answer 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的百科全书文件上传 。 只要仔细阅读其用户指南常见问题解答部分以了解如何使用它。 我已经发布了代码示例的答案之前, 在这里 (也包含一个示例瞄准的Servlet 3.0)。



Answer 2:

解决方案:

溶液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. 调用的getParameter上com.bigfoot.bugar.servlet.http.MultipartFormData

解决方案d:

使用Struts。 Struts 1.1中自动处理这一点。

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



Answer 3:

并不总是有一个上传的前一个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
        }
}


文章来源: Convenient way to parse incoming multipart/form-data parameters in a Servlet [duplicate]