java - 如何使用 java servlet 进行受限文件传输

标签 java servlets upload

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

我的想法是:

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

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

    <

现在问题: 选项A:

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

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

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

选项B:

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

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

谢谢

最佳答案

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

我选择了以下设置:

客户端使用 Apache 的 HttpClient 发布了一个由两部分组成的帖子和 HttpMime(请参阅 引用资料 多部分帖子示例 here )。第一部分是包含所有必需元数据的 JSON (UTF-8) 字符串。该 JSON 字符串通过 Map 进行编码/解码,使用 Jackson 的示例是 here 。第二部分是文件上传(FileBody-part)。

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

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

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

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

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

关于java - 如何使用 java servlet 进行受限文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942179/

相关文章:

java - 数字的乘积

java - Websocket 通过 Tomcat 中的 Servlet

java - 使用JSP/MySQL实现自动竞价功能

java - 如何将文件上传到 FTP 服务器?

linux - 使用 linux 的 ftp 命令上传图像文件后损坏,类型为 ASCII

java - 如何防止XML中的自关闭<tags/>?

java - 无法公开 long com.sun.management.internal.OperatingSystemImpl.getOpenFileDescriptorCount()

java - JPA : Create multiple parent, GAE 上的独生子女关系

c# - 无法在 C# 中使用 SSH.NET 上传文件 SFTP - 权限被拒绝

java - 在运行时将组件添加到 jpanel