从多部分请求获取表单参数而不获取文件

时间:2009-11-17 11:37:38

标签: java servlets multipartform-data

我正在寻找一种在Servlet过滤器中获取HTTP多部分请求的表单参数的方法,而不需要上传文件。

request.getParameterMap()返回空。我理解这是因为请求是多部分的。

我看过commons.HttpFileUpload,但这似乎对我的情况有点过分。在这个过滤器中,我只对正常参数感兴趣,并且不想处理文件上传。

编辑:主要问题是我需要在过滤器堆栈的下方有一个完整的HttpRequestObject。 HttpFileUpload似乎消耗了部分请求数据(可能是通过使用数据流对象并再次关闭它。)

4 个答案:

答案 0 :(得分:6)

这肯定不是矫枉过正,这是正确的方式,总是比自己编写解析器更好。 Apache Commons FileUpload已开发和维护多年,并已证明其在处理多部分/表单数据请求方面的稳健性。你不想重新发明轮子。如果你真的想这样做(我不推荐),那么请阅读multipart/form-data specification并开始阅读HttpServletRequest#getInputStream()(警告:这是二进制和字符数据的混合!)。

如果有必要,您可以编写一个过滤器,它使用Apache Commons FileUpload并检查每个请求是否为multipart / form-data,如果是,请将参数放回请求参数映射中。 Commons FileUpload并将上传的文件(或异常)作为请求属性放置,以便最终在servlet代码中更透明。你可以找到here一个基本的例子来获得这个想法。

希望这有帮助。

答案 1 :(得分:4)

Oreilly Servlets网站有一些示例代码,您可以下载自定义和使用。这包括MultipartRequest,它听起来像你需要的那样,它解除了多部分请求并允许分别访问参数和文件。

答案 2 :(得分:4)

只是添加已经提供的答案 - 我遇到了一个非常类似的问题,我试图在现有的网络应用程序中添加一些CSRF验证。我们决定使用一些JS在每个表单中包含一个特殊标记,并添加一个servlet过滤器来检查该标记是否存在(因此是一个通用的隔离解决方案)。

servlet将检查令牌是否存在但是针对提供文件上载选项的每个表单都打破了。因此,我在做谷歌搜索时经常登陆这个页面。

我们使用的工作(试图避免与上传的文件进行任何交易)是为了让一些JavaScript将令牌添加为GET参数,即我们修改了表单的操作URL以包含令牌,因此可以使用令牌的HttpServletRequest.getParameter()方法(只有令牌)。

我已经在IE,FF和Chrome中对此进行了测试,所有人似乎都很开心。

希望这有助于任何发现自己处于类似情况的人。

答案 3 :(得分:0)

Commons FileUpload提供了一种从多部分表单上传中读取请求参数的机制。

这里有一个非常好的例子来说明如何获取请求参数:

How to upload files to server using JSP/Servlet?