【问题标题】:Sending multiple files to a servlet with a single connection使用单个连接将多个文件发送到 servlet
【发布时间】:2011-05-28 13:41:16
【问题描述】:

我正在编写一个 Java 桌面客户端,它将使用 post 请求通过网络将多个文件发送到 servlet。在 servlet 中,我从请求中获取输入流以接收文件。当从流中读取文件时,servlet 会将文件一一写入磁盘。

实现有几个要求:

  • 只能向服务器使用一个 HTTP 请求(因此只有一个流)
  • 无论文件大小如何,servlet 都必须使用合理的固定内存量。

我曾考虑在流中插入标记,以便知道一个文件何时结束,下一个文件何时开始。然后我会编写一些代码来解析 servlet 中的流,并根据需要开始编写下一个文件。

事情是这样的……肯定有一个图书馆可以做到这一点。我浏览了 apache commons,一无所获。 Commons 文件上传很有趣,但由于上传来自 Java 应用程序,而不是浏览器,它只解决了接收端,而不是发送端。

对于一个库有什么想法,即使对于非常大的文件,也可以轻松地在单个流中传输多个文件,并具有固定的内存预期?

谢谢。

【问题讨论】:

    标签: java http servlets file-upload


    【解决方案1】:

    只需在 POST 请求正文上使用 HTTP multipart/form-data 编码。它在RFC-2388 中有描述,也是一种通过 HTTP 上传(多个)文件的标准方式。

    您可以使用java.net.URLConnection 来完成此操作,如mini-tutorial 中所述,尽管它会生成大量样板代码。更方便的方法是使用Apache Commons HttpClient

    在 servlet 端,您可以使用 Apache Commons Fileupload 以通常的 HTTP 方式处理上传的文件(或者当您已经在 Servlet 3.0 上时,HttpServletRequest#getParts(),另请参见 this answer 示例)。

    【讨论】:

    • 太好了,感谢 BalusC,我错过了 HttpClient 部分。这似乎正是我所需要的。这里有一个代码示例 (radomirml.com/2009/02/13/…)。我能看到的唯一有问题的部分是跟踪上传进度,但我怀疑我可以为此连接到 FileBody。再次感谢。乔恩。
    • @BalusC 伙计,我真的希望你看到这个 b/c 我迷路了!我想通过 ajax 在请求中发送多个文件和一个字符串参数,但我不确定如何将发送参数构造为具有常规字符串参数以及多个文件。我可以做 ajaxObject.send(string=string&file1=file1&file2=file2); ?
    • 该链接不会将我带到任何结果
    • @gmustudent: stackoverflow.com/…
    • 你的第一个教程正是我现在正在做的。我有拖放和一切。我应该做 ajaxObject.send(formData + params) 还是相反?还是真的不重要?在您的示例中,您只发送 formData 但我也需要常规参数
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多