如何将几个大文件流式传输到码头

How to stream several large files to jetty

我想使用 multipart/formdata 通过 HTTP 发送几个大文件。

我实际上只是想通过我的服务流式传输它们,所以我想将不同的部分作为流获取,并且绝对希望避免在我有机会通过上的数据。

我觉得使用 Jetty(我们使用的是 Jetty 9.0.7 附带的 Dropwizard 0.7.1),整个请求在我的代码执行之前得到缓冲。

有办法避免吗?理想情况下,我想要一个基于事件的系统(它触发一个像 "next part with name xxx" 这样的事件并给我一个我可以使用的流)。

具有 multipart/formdata 的请求由各种内部组件处理以拆分部分,以便 HttpServletRequest.getParts()(以及各种类似方法)可以正常工作。

选项 #1:自己处理多部分

颠覆 Servlet 规范的这种行为可能有点棘手,但我会试一试。

首先,不要声明要处理此请求数据的 servlet 的 @MultipartConfig 配置。

接下来,访问HttpServletRequest中需要了解请求参数或其部分的方法。

覆盖 HttpServlet.service(HttpServletRequest, HttpServletResponse) 方法,而不是 doPost() 方法,并自己处理原始请求负载内容。

这意味着您将编写多部分 InputStream 解析器,并自行处理多部分的解析。网上有很多这样的例子,您只需选择一个对您来说更有意义的。

选项 #2:不要将 POST 与 multi-part

一起使用

如果您正在流式上传文件,请不要将 POST 与多部分一起使用,将 PUT 与原始有效负载数据一起使用,那么您将跳过整个魔法层,即多部分请求 POST 负载。