2010-12-21 98 views
4

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

的实施方案具有几个要求:

  • 只有一个HTTP请求必须使用到服务器(所以只有单流)
  • 该servlet必须使用的存储器中的合理固定量,没有不管文件的大小如何。

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

这是事情......当然有一个库可以做到这一点。我已经通过apache commons浏览过,没有发现任何东西。 Commons File Upload很有趣,但由于上传来自Java应用程序,而不是浏览器,它只能解决接收端而不是发送。

任何关于图书馆的想法,即使对于非常大的文件,也可以轻松地在单个数据流中进行多个文件传输,并且具有固定的内存预期?

谢谢。

回答

7

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

您可以按照mini-tutorial中描述的java.net.URLConnection来完成,不过它会生成大量的样板代码。更方便的方法是使用Apache Commons HttpClient

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

+0

非常好,谢谢BalusC,我错过了HttpClient部分。这似乎正是我需要的。这里有一个代码示例(http://radomirml.com/2009/02/13/file-upload-with-httpcomponents-successor-of-commons-httpclient)。我能看到的唯一有问题的部分是跟踪上传进度,但我怀疑我能够为此获取FileBody。再次感谢。乔恩。 – user549335 2010-12-21 14:39:52

+0

不客气。 – BalusC 2010-12-21 14:50:56

+0

@BalusC男人我真的很希望你看到这个B/C我迷路了!我想通过ajax发送请求中的多个文件和一个字符串参数,但我不知道如何构造send参数以具有常规字符串参数,还有多个文件。我可以只做ajaxObject.send(string = string&file1 = file1&file2 = file2); ? – gmustudent 2013-03-06 08:49:21

相关问题