【问题标题】:Does Spring Framework support streaming mode in multipart requestsSpring Framework 是否支持多部分请求中的流模式
【发布时间】:2011-05-31 14:45:29
【问题描述】:

我在Spring documentation 中找不到任何迹象表明它支持在处理多部分请求的对象 MultipartHttpServletRequest 中以流模式读取文件。

Apache Commons framework 中可能的类似方式。

Spring 是否完全支持它?

【问题讨论】:

  • “流媒体模式”是什么意思?
  • 我的意思是当应用程序要读取文件时,请求并没有完全发送到服务器,而是服务器可以控制请求并一一读取它的文件。能够处理超大尺寸的请求
  • 您需要重新考虑上传大文件的策略。您可能必须编写一个拆分大文件的客户端和一个在获取所有片段后将它们组合起来的 servlet。顺便说一句,服务器永远无法控制请求。无论如何它必须完全接受请求(即使有人试图攻击它)。

标签: java spring file-upload apache-commons


【解决方案1】:

是的,看看here。您的 Spring API 太旧了。此外,Streaming 模式与 Spring 无关。这是您的 servlet 容器或服务器的能力。大多数服务器现在支持流模式。 Servlet 将在从您的请求中获取标头后立即开始执行请求。您可以继续发送请求正文的流(例如多部分数据)。但是,只有当请求完全发送时,才能完全执行解析。这与 Apache Common FileUpload 相同。

或者,您可以使用 Spring 注解编写控制器。如果您将其添加为方法控制器参数之一,Spring 将注入 ServletRequest。之后,您可以使用 Apache FileUpload 进行多部分解析。

您不能进行选择性解析,因为无论如何都必须将请求完全发送到服务器。这是Http的极限。前几天我问了question

【讨论】:

  • 我不认为请求必须完全发送到服务器。在这里查看我的回复:stackoverflow.com/questions/1836760/…
  • @Spiderman 我在您的帖子中看不到任何解释。我之所以这么说是因为我已经使用调试器对其进行了实验。即使流尚未完全发送,但标头已发送,Servlet 线程也会开始运行。 FileUpload API 开始读取流并将其写入临时文件。在可以执行下一条指令之前,必须完全接收流。否则 FileUpload 会抛出异常并移除之前上传的数据。
  • 我正在使用普通的 HTTPServletRequest 进行体验,而不是使用任何扩展它的 Spring 包装器。我使用 HTTP 嗅探器检查并得出结论,只要我没有从请求的流中读取,客户端就不会将数据发送到服务器端,所以我作为在 Web 服务器上运行的应用程序程序员可以控制 HTTP 请求的传递
  • 我做了和你描述的一样的事情。我使用 html 表单 POST 提交文件。我捕获的流有附加的内容。我注意到如果我上传一个大文件,我的 servlet 将不会响应响应,因为 Web 浏览器会完全发送请求。所以我的结论是,即使你没有对它做任何事情,流也会被完全发送。
  • 从使用 URLConnection 发布的简单多部分/表单数据上传时发生了同样的事情。
猜你喜欢
  • 2014-02-19
  • 2022-08-03
  • 2017-06-16
  • 1970-01-01
  • 2013-10-25
  • 2013-01-05
  • 2012-08-12
  • 1970-01-01
  • 2021-03-09
相关资源
最近更新 更多