从浏览器上传多个文件的最佳方法

我正在开发一个Web应用程序。 有一个地方,用户可以用HTTP协议上传文件。 在经典的HTMLfile upload控制和Java applet之间有一个上传文件的select。

经典的HTMLfile upload并不是很好,因为一次只能select一个文件,在实际上传过程中很难得到任何进度指示(我终于用定时器刷新了一个进度指示器,服务器通过AJAX调用)。 好处:它总是工作。

使用Java小程序,我可以做更多的事情:一次select多个文件(即使是一个文件夹),压缩文件,得到一个真正的进度条,拖动小程序上的文件,等等…
但是有一些缺点:

  • 让它在Mac Safari和Mac Firefox上正常工作是一场噩梦(Thanks Liveconnect)
  • 用户界面不完全是原生用户界面,有些人注意到了这一点
  • 这个小程序并不像应该那样快速响应(可能是我的错,但是对我来说,一切看起来都不错)
  • 使用HTTPS的Java UrlConnection类中存在错误,所以我使用Apache通用HTTP客户端来进行实际的HTTP上传。 这是一个非常大的包,并减缓了.jar文件的下载速度
  • Apache常见的HTTP客户端有时会经历代理服务器的麻烦
  • Java运行时相当大

我一直在维护这个Java小程序一段时间,但现在我厌倦了所有的缺点,并考虑编写/购买一个全新的组件来上传这些文件。

如果您有以下要求:

  • 通过HTTP或HTTPS轻松地从浏览器上传多个文件
  • 压缩文件以减less上传时间
  • 上传应该可以在任何平台上使用本地用户界面
  • 必须能够上传大文件,至less2GB
  • 你有技术上的全权委托

你会用什么技术/组件?


编辑:

  • 在组件上拖放文件将是一个很大的优点。
  • 看起来好像有很多与Flash Player的bug有关的问题( swfupload已知问题 )。 正确的Mac支持和通过代理上传身份validation是我不能没有的选项。 这可能会排除所有基于Flash的选项:-(。
  • 我排除了所有HTML / Javascript-only选项,因为您不能一次select多个文件并使用经典的HTML控件。 当您想要select文件夹中的多个文件时,点击n次“浏览”button是一种痛苦。

我最近在Silverlight中实现了一些东西。

基本上使用HttpWebRequest发送一个数据块到GenericHandler。

在第一篇文章中,发送了4KB的数据。 在第二块,我发送另一个4K块。

当收到第二块时,我计算它在第一块和第二块之间的往返行程,所以现在发送第三块时知道增加速度。

使用这种方法,我可以上传任何大小的文件,我可以恢复。

每篇文章我发送这个信息:

[参数] [FILEDATA]

在这里,参数包含以下内容:[块#] [文件名] [会话ID]

在收到每个块之后,我发回一个响应给我的Silverlight,说明它花了多快才能发送一个更大的块。

很难把我的解释没有代码,但基本上我是这么做的。

在某个时候,我会就如何做到这一点做一个快速的写作。

我从来没有用过2GB大小的文件 ,但是YUI File Uploader在以前的项目上工作得很好。 你也可能对这个jQuery插件感兴趣。

也就是说,我仍然认为Java Applet是一条可行的路。 我想你最终的可移植性和用户界面问题比预想的要less,拖放效果也不错。 为了logging,Box.net使用Java Applet进行多文件快速上传。

好的,这是我的承担

我使用swfupload做了一些testing,而且我有以前使用Java的经验,我的结论是, 无论使用什么技术,都没有完美的解决scheme来在浏览器上进行上传 :上传大文件时总是会出现错误,通过代理,与ssl等…

但是:

  • 一个Flash上​​传(一个swfupload)是真正轻量级,不需要从用户的授权,并有一个本地接口,这是真的很酷,我认为
  • 一个java上传需要授权,但你可以做任何你想要的用户select的文件(也可以压缩,如果需要的话),并拖放运作良好。 尽pipe准备一些史诗般的错误debuggin'。
  • 只要我想这也许是真正的答案,我没有改变玩Silverlight,虽然技术还很年轻,所以…我会编辑这个post,如果我有机会拨弄一下与Silverlight

感谢所有的答案 !!

有许多免费的Flash组件,具有很好的多file uploadfunction。 他们在服务器端使用带有PHP(或其他)接收器的ActionScript FileReference类。 有些最近打破FP10的推出,但我知道肯定swfupload将工作:)

希望这可以帮助!

怎么样这两个Jupload http://jupload.sourceforge.net/和jumploader http://jumploader.com/

两者都是Java小程序,但它们也都很容易使用和实施。

谷歌齿轮呢?

有HTTP / HTTPS上传控件允许多file upload。 这里有一个来自Telerik,我发现它是坚实可靠的。 最新的版本看起来如果不是全部function需求,

你也可以用HTTP表单上传多个文件,就像Dave已经指出的那样,但是如果你使用HTTP和Javascript提供的东西以外的东西,我会考虑使用Flash。 它甚至有一些预先存在的解决scheme,如MultiPowUpload ,它提供了许多你正在寻找的function。 使用Flash客户端获取进度信息比使用Javascript的AJAX调用更容易,因为您拥有更多的灵活性。

您可以检查Apache Commons FileUpload软件包。 它允许您上传多个文件,监控上传进度等等。 您可以在这里find更多信息:

http://commons.apache.org/fileupload/
http://commons.apache.org/fileupload/using.html

祝你好运

在java中最简单的file upload方式是GOJFileUpload.jar库

这里是gojfileupload库教程:

GOJFileUpload

他们给两个方法

  • UploadFile(string文件path,ArrayList图像名称,HttpRequest请求)
  • UploadFile(String filepath,ArrayList dataname,ArrayList imagenames,HttpRequest请求)

他们会返回你HashMap你上传后在给定的目标文件夹上传的所有文件名。