【问题标题】:Best way to upload multiple files from a browser从浏览器上传多个文件的最佳方式
【发布时间】:2009-02-24 15:11:48
【问题描述】:

我正在开发一个网络应用程序。用户可以在一处使用 HTTP 协议上传文件。可以在经典的 HTML 文件上传控件和用于上传文件的 Java 小程序之间进行选择。

经典的 HTML 文件上传不是很好,因为您一次只能选择一个文件,并且在实际上传期间很难获得任何进度指示(我终于使用计时器刷新了带有数据的进度指示器通过 AJAX 调用从服务器获取)。优点:它始终有效。

使用 Java 小程序,我可以做更多事情:一次选择多个文件(甚至是一个文件夹)、压缩文件、获得真正的进度条、在小程序上拖放文件等...
但也有一些缺点:

  • 让它在 Mac Safari 和 Mac Firefox 上正常工作是一场噩梦(感谢 Liveconnect)
  • UI 并不完全是原生 UI,有些人注意到
  • 小程序没有应有的响应(可能是我的错,但在我看来一切正常)
  • 使用HTTPS的JavaUrlConnection类存在bug,所以我使用Apache通用HTTP客户端进行实际的HTTP上传。这是一个相当大的包,会减慢 .jar 文件的下载速度
  • Apache 通用 HTTP 客户端有时无法通过代理
  • Java 运行时很大

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

问题

如果您有以下要求:

  • 通过 HTTP 或 HTTPS 从浏览器轻松上传多个文件
  • 压缩文件以减少上传时间
  • 上传应该可以在任何平台上使用原生 UI
  • 必须能够上传大文件,至少达到 2gb
  • 您对这项技术拥有全权委托

您会使用什么技术/组件?


编辑:

  • 在组件上拖放文件将是一大优势。
  • 看起来有很多与 Flash Player 错误相关的问题 (swfupload known issues)。适当的 Mac 支持和通过具有身份验证的代理上传是我不能没有的选项。这可能会排除所有基于 Flash 的选项 :-( .
  • 我排除了所有 HTML/Javascript-only 选项,因为您不能使用经典 HTML 控件一次选择多个文件。当您想在一个文件夹中选择多个文件时,单击 n 次“浏览”按钮会很痛苦。

【问题讨论】:

  • 可恢复上传怎么样?这对我来说似乎真的很重要。没有人喜欢在几个小时后重新开始上传失败的文件。
  • 没错,在那种情况下,我认为您仍然不能使用 Flash,只能使用 Java(和 Silverlight?)
  • 您好,另一个基于 Flash 的上传器位于 digitarald.de/project/fancyupload

标签: java flash silverlight http upload


【解决方案1】:

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

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

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

当收到第二块时,我计算第一块和第二块之间的往返行程,所以现在 发送后的第 3 个块将知道提高速度。

使用这种方法,我可以上传任意大小的文件,并且可以继续。

我发送的每个帖子都包含此信息:

[参数] [文件数据]

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

收到每个块后,我会向我的 Silverlight 发回一个响应,说明它需要多快,以便它现在可以发送更大的 块。

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

在某个时候,我会整理一下我是如何做到这一点的。

【讨论】:

  • 听起来很酷,我也想尝试这样做。我喜欢我们最终可以使用托管代码在客户端操作文件!银光万岁!
  • 您是否在 silverlight 播放器中遇到有关浏览器 cookie 管理、代理、平台支持的问题?
  • silverlight 在客户端运行,而我的上传处理程序在服务器端。由于它们都与会话分离,因此我会在启动时将会话 ID 传递给 silverlight。上传时,会话然后从 silverlight 传递到处理程序,从而将所有内容都保存在一个会话中
【解决方案2】:

我从未将它用于 2GB 大小的文件,但 YUI File Uploader 在以前的项目中运行良好。你可能也对这个jQuery Plugin感兴趣。

也就是说,我仍然认为 Java Applet 是要走的路。我认为您最终会遇到比您预期的更少的可移植性和 UI 问题,并且拖放效果很好。作为记录,Box.net 使用 Java Applet 进行多文件快速上传。

【讨论】:

  • Box.net 使用 Flash 组件作为上传的首选。然后,该组件为想要使用“drag'n'drop”的用户提供指向 Java 小程序的链接
【解决方案3】:

好的,这是我的看法

我用 swfupload 做了一些测试,并且我以前有使用 Java 的经验,我的结论是无论使用什么技术,都没有完美的解决方案可以在浏览器上进行上传:你会上传大文件、通过代理、使用 ssl 等时总是会出现错误......

但是:

  • Flash 上传器(la swfupload)非常轻量级,不需要用户授权,并且有一个非常酷的本机界面,我认为
  • java 上传程序需要授权,但您可以对用户选择的文件执行任何操作(如果需要,也可以进行压缩),并且拖放效果很好。不过,请为调试一些史诗般的错误做好准备。
  • 我没有改变使用 Silverlight,只要我愿意,也许这就是真正的答案,虽然这项技术还很年轻,所以......如果有机会,我会编辑这篇文章用 Silverlight 摆弄一下

谢谢大家的回答!!

【讨论】:

  • 给几年后找到此答案的人们的说明。我们已经使用 SWFUpload 多年了,总的来说,它运行良好。需要注意的一点是,由于 Flash Player 9 不发送授权标头,因此如果您使用集成 Windows 身份验证或需要身份验证的代理服务器,它将无法工作。出于这个原因,我们已经转向基于 HTML5 的解决方案。
【解决方案4】:

有许多免费的 Flash 组件具有良好的多文件上传功能。他们在服务器端使用带有 PHP(或其他)接收器的 ActionScripts FileReference 类。一些最近因 FP10 的推出而中断,但我确信 swfupload 会起作用 :)

希望这会有所帮助!

【讨论】:

    【解决方案5】:

    这两个呢 下载 http://jupload.sourceforge.net/ 和 跳跃者 http://jumploader.com/

    两者都是 java 小程序,但它们也都非常易于使用和实现。

    【讨论】:

    • 是的,我已经听说过 JUpload,但从来没有机会/时间对其进行实际压力测试。我知道通过https上传通常是问题(问题在于JDK实现本身。如果JUpload使用默认实现,它可能会遇到问题)。
    • 关于 Jumploader : UI 看起来很不错,似乎支持 HTTPs。在我看来值得一看:)
    【解决方案6】:

    google gears 呢?

    【讨论】:

    • 好主意,但有点可怕的是 Mac OS X Snow Leopard 不支持它:Snow Leopard 已经推出 2 个月了!出于好奇,我会尽快在 Firefox 上尝试 ;) 谢谢!
    【解决方案7】:

    有允许多文件上传的 HTTP/HTTPS 上传控件。 Here 来自 Telerik,我发现它是可靠的。最新版本似乎满足了您的大部分功能要求(如果不是全部的话)。

    【讨论】:

    • 与其他 AJAX 上传器不同,这个是与 .NET 绑定的,所以没用
    • 另外,您不能一次选择一个文件。也许你想谈谈 Telerik silverlight 上传控件
    【解决方案8】:

    正如 Dave 已经指出的那样,您也可以使用 HTTP 表单上传多个文件,但是如果您打算使用超出 HTTP 和 Javascript 提供的东西,我会大力考虑使用 Flash。甚至还有一些预先存在的解决方案,例如MultiPowUpload,它提供了您正在寻找的许多功能。使用 Flash 客户端获取进度信息也比使用来自 Javascript 的 AJAX 调用更容易,因为您有更多的灵活性。

    【讨论】:

      【解决方案9】:

      您可以查看 Apache Commons FileUpload 包。它允许您上传多个文件、监控上传进度等。您可以在这里找到更多信息:

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

      祝你好运

      【讨论】:

      • Apache Commons Fileupload 是一个 java 服务器端库,用于解析文件上传 http post。我已经让那部分工作了。我真的专注于客户端部分。
      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2014-02-11
      • 2010-09-23
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多