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