5

我正在测试 Servlet 3.1 API 来处理多部分请求。我对同步处理某些部分(文本字段)和其他异步(文件字段)感兴趣。乍一看,它似乎在 Servlet 3.1 中不可用(在异步上下文中通过 request.getInputStream() 完全异步或类似于 apache-commons-fileupload 库的多部分处理)。

有没有办法使用 Servlet 3.1 获得这种同步/异步处理?

在此先感谢您的时间!:)

4

4 回答 4

7

Synchronoss Technologies 最近开源了一个非阻塞 HTTP 多部分解析器,可在此处与 Servlet 3.1 一起使用。

您只需编写 Servlet 3.1ReadListener即可将传入字节传递给NioMultipartParser. 解析器将对收到的每个部分的代码进行回调。

免责声明:我在 Synchronoss Technologies 工作。我们开源了这个,因为实现起来非常头疼!Servlet 3.1 提供的功能似乎存在差距,因此希望其他人会发现这个库很有用。

于 2016-07-25T17:28:43.230 回答
3

我一直在寻找一个类似的例子,但令我惊讶的是,自从最初的问题发布一年后,却没有多少。

无论如何,我正要写自己的,但我的判断力更高了,谷歌来救援了。Grizzly 项目在这里编写了一个异步多部分示例:https ://grizzly.java.net/httpserverframeworkextras.html

这不能直接插入到 Servlet 3.1 readListener 中,但我认为适应它应该是相当直接的(我的下一个任务)。

于 2014-10-06T11:52:19.460 回答
0

如果您可以确保所有文本字段都排在第一位,那么您应该能够先同步读取这些字段,然后异步读取文件字段。

否则只能通过将整个请求同步或异步读取到内存中,然后直接处理文本字段并将文件字段提交到某个线程池来实现。

于 2014-05-07T07:48:50.730 回答
0

无法在同步/异步之间切换,没有一个常见的库/API 支持。

servlet API 在 3.0 版中增加了对上传处理的支持,但它是完全阻塞的。

Commons Fileupload库具有流 API,您可以以阻塞或异步方式调用它,但您必须自己实现它。

你也可以使用这个库,它可以配置为在阻塞模式或异步模式下工作(通过实现 ReadListener 接口)。如果您知道某些请求将仅包含文本字段或小文件,那么您可以基于此进行配置。

于 2015-12-11T20:51:06.580 回答