当前位置: 首页 > 面试题库 >

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

艾安和
2023-03-14
问题内容

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

例如客户发起发布请求

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

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


问题答案:

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的示例)。



 类似资料:
  • 我有一个Web表单,其中包含一个文件上传选项和许多其他输入参数。我正在寻找一种方法来使用泽西请求处理程序处理此问题,其中方法参数将是文件输入和“所有其他参数”。 这个问题解释了我无法将其他参数获取到自定义模型对象中,因为浏览器将它们作为单独的多部分对象发送。接下来我尝试的是检索多值映射中的其他参数: 不幸的是,这也不起作用。 表单中还有大约20个其他参数(其中一个是多选择选项),因此我不想将它们作

  • 问题内容: 我似乎找不到这个问题的真正答案,所以我去了: 如何解析PHP格式的原始HTTP请求数据?我知道,如果格式正确,则原始POST会自动进行解析,但是我要引用的数据来自PUT请求,而PHP并不会自动对其进行解析。数据是多部分的,看起来像: 我像这样(伪代码)使用libcurl发送数据: 如果删除CURLOPT_CUSTOMREQUEST位,则该请求将在服务器上作为POST处理,并且一切都将被

  • 本文向大家介绍深入解析Java编程中方法的参数传递,包括了深入解析Java编程中方法的参数传递的使用技巧和注意事项,需要的朋友参考一下 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value 2.

  • 问题内容: 我想在JavaScript中使用XMLHttpRequest来发布包含文件类型输入元素的表单,以便避免页面刷新并返回有用的XML。 我可以使用JavaScript将表单上的目标属性设置为MSIE的iframe或Mozilla的对象,而无需刷新页面即可提交表单,但这有两个问题。较小的问题是目标与W3C不兼容(这就是为什么我在JavaScript中而不是在XHTML中设置目标)。主要问题是

  • 问题内容: 我正在尝试使用伪装完成多部分文件上传,但似乎在任何地方都找不到很好的示例。我本质上希望HTTP请求类似于以下内容: 甚至… 我是否需要手动构建请求主体,包括生成多部分边界?考虑到此客户端可以执行的其他所有操作,这似乎有点过头了。 问题答案: 不,你没有。您只需要定义一种代理接口方法,将content-type指定为:multipart / form- data和其他信息,例如远程API

  • 我试图使用feign完成一个多部分文件上传,但是我似乎在任何地方都找不到一个好的例子。我基本上希望HTTP请求的结果类似如下: 或者甚至… 我需要手动构建请求体吗,包括生成多部分边界?考虑到这个客户端可以做的所有其他事情,这似乎有点过分。