我正在测试 Servlet 3.1 API 来处理多部分请求。我对同步处理某些部分(文本字段)和其他异步(文件字段)感兴趣。乍一看,它似乎在 Servlet 3.1 中不可用(在异步上下文中通过 request.getInputStream() 完全异步或类似于 apache-commons-fileupload 库的多部分处理)。
有没有办法使用 Servlet 3.1 获得这种同步/异步处理?
在此先感谢您的时间!:)
我正在测试 Servlet 3.1 API 来处理多部分请求。我对同步处理某些部分(文本字段)和其他异步(文件字段)感兴趣。乍一看,它似乎在 Servlet 3.1 中不可用(在异步上下文中通过 request.getInputStream() 完全异步或类似于 apache-commons-fileupload 库的多部分处理)。
有没有办法使用 Servlet 3.1 获得这种同步/异步处理?
在此先感谢您的时间!:)
Synchronoss Technologies 最近开源了一个非阻塞 HTTP 多部分解析器,可在此处与 Servlet 3.1 一起使用。
您只需编写 Servlet 3.1ReadListener
即可将传入字节传递给NioMultipartParser
. 解析器将对收到的每个部分的代码进行回调。
免责声明:我在 Synchronoss Technologies 工作。我们开源了这个,因为实现起来非常头疼!Servlet 3.1 提供的功能似乎存在差距,因此希望其他人会发现这个库很有用。
我一直在寻找一个类似的例子,但令我惊讶的是,自从最初的问题发布一年后,却没有多少。
无论如何,我正要写自己的,但我的判断力更高了,谷歌来救援了。Grizzly 项目在这里编写了一个异步多部分示例:https ://grizzly.java.net/httpserverframeworkextras.html
这不能直接插入到 Servlet 3.1 readListener 中,但我认为适应它应该是相当直接的(我的下一个任务)。
如果您可以确保所有文本字段都排在第一位,那么您应该能够先同步读取这些字段,然后异步读取文件字段。
否则只能通过将整个请求同步或异步读取到内存中,然后直接处理文本字段并将文件字段提交到某个线程池来实现。
无法在同步/异步之间切换,没有一个常见的库/API 支持。
servlet API 在 3.0 版中增加了对上传处理的支持,但它是完全阻塞的。
Commons Fileupload库具有流 API,您可以以阻塞或异步方式调用它,但您必须自己实现它。
你也可以使用这个库,它可以配置为在阻塞模式或异步模式下工作(通过实现 ReadListener 接口)。如果您知道某些请求将仅包含文本字段或小文件,那么您可以基于此进行配置。