【问题标题】:How to make a constrained file transfer with java servlets如何使用 java servlet 进行受约束的文件传输
【发布时间】:2014-03-23 10:12:01
【问题描述】:

我需要将一些二进制文件从通用 java 客户端传输到使用 servlet 技术的服务器。
问题来了,因为我需要检查一些随文件发送给我的数据以授权上传。此外,我还需要有关该文件的其他信息以表征它(名称,作者,...)。

我的想法是:

  • (A) 使用通过默认输入流接收请求的 GenericServlet。它将读取预先格式化的数据结构,然后如果数据正常,它将读取并保存文件

  • (B) 使用 HttpServlet 并进行通常的 http 文件上传(这将需要客户端环境中的 http 支持)并使用一些 post 属性来获取附加数据。

    李>

现在的问题: 选项A:

  • 有一种方法可以在文件之前获取初始数据,以便首先检查它们,然后仅在数据正常时才允许文件传输,这样可以限制内存使用量不好?

  • 如果文件很长并且以 N 部分到达服务器,并且 servlet 在客户端完成发送所有 N 部分之前检查附加信息发现它们不好,有没有办法通过在转移过程中回答客户以打破“坏”和繁重的请求来中断转移?

  • 我能否在同一个请求中将多个 Java 对象(如本例中的自定义 FileInfo 类)与二进制文件一起传输?

选项 B:

  • 始终使用 http 是一种好习惯吗?

  • 一旦设置了多部分数据类型,文件内容作为post变量的内容发送?

谢谢

【问题讨论】:

  • 您可以在开始上传之前在 Javascript 中检查文件大小客户端developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5/… 其余的,如果可能的话,我会感到惊讶。
  • 客户端一般不应该是html/js。无论如何,我更喜欢验证数据服务器端,因为它更安全,我需要检查和存储更多数据

标签: java servlets upload


【解决方案1】:

两个选项都不错,但 B 比 A 更灵活。我刚刚在工作中实现了选项 B 来替换/隐藏旧协议。在我看来,使用 HTTP 是一种很好的做法:它不会很快消失,几乎所有的编程语言都对它有很好的支持。此外,管理员还有很多工具可以授权请求、引导流量和监控负载。

我选择了以下设置:

客户端使用 Apache 的 HttpClient 和 HttpMime 进行两部分发布(参见 here 的多部分发布示例)。第一部分是包含所有必需元数据的 JSON (UTF-8) 字符串。此 JSON 字符串通过 Map 进行编码/解码,使用 Jackson 的示例为 here。第二部分是文件上传(FileBody-part)。

服务器是一个 Tomcat Servlet,它使用 Commons FileUpload 接收这两个部分。第一个 JSON 部分首先需要并经过验证。如果不正常,则 servlet 立即发送“NOK”响应(例如“Bad request”)。然后接收并处理文件。

我选择 JSON 作为元数据,因为它是一种易于理解的格式(像 XML 一样可读)并且在 web-world 中有很好的支持。另一种方法是使用 http-headers 作为参数并将文件作为正文发送(可能更容易实现)。

我选择了 Apache 的 HttpMime 和 Common 的 FileUpload,因为它们可以很好地协同工作。不难理解这些应该如何协同工作(研究示例),而且我还没有遇到真正难以解决的问题。此外,Apache 的 HttpClient 4.3 最终默认支持我以前不得不跳到箍的功能(例如(解)压缩请求)。

但对我来说第一:文件数据的处理是流式传输的。我已通过在由 Apache HttpClient 动态压缩的多部分发布请求中上传 2GB 文件来确认这一点。客户端和服务器都没有要求任何额外的内存来处理这个大文件(但是传输所有字节确实需要一些时间)。

由于 HTTP 的性质,我担心您无法让客户端在启动后停止发送文件数据。但这不应该是一个问题,因为这将是一个例外情况,而不是常态。

【讨论】:

  • 非常感谢您的建议,我会检查httpmime和fileupload的解决方案!
  • 另一个问题,2-part request 是什么意思?两个请求还是一个请求分为两部分?
  • @mb_ 后者(参见多部分帖子示例)。由于网络延迟,第一个(两个请求)会慢很多。此外,由于 HTTP 本质上是无状态的,服务器如何跟踪两个独立的相关客户端请求?
  • 使用会话?顺便说一句,这就是我的想法。感谢回复我现在正在研究apache http组件!
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多