【问题标题】:Splitting a file before upload?上传前拆分文件?
【发布时间】:2011-05-05 05:40:46
【问题描述】:

在网页上,是否可以在文件上传到服务器之前将大文件分割成块?例如,将一个 10MB 的文件拆分为 1MB 的块,并在显示进度条的同时一次上传一个块?

听起来 JavaScript 没有任何文件操作能力,但 Flash 和 Java 小程序呢?

这需要在 IE6+、Firefox 和 Chrome 中工作。 更新:忘记提及 (a) 我们正在使用 Grails 并且 (b) 这需要在 https 上运行。

【问题讨论】:

  • 这可能在 Flash 和 Java 中都是可能的,但为什么呢?这有什么意义?你想绕过大小限制吗?
  • 这是另一个类似的问题:stackoverflow.com/questions/3155587/…
  • 我主要是探索这个选项以避免不得不在服务器端处理大文件。上传文件的内容需要解析并存储在数据库中。对于大量数据,我们需要在前端有一个专用的长寿命线程池来传输所有数据,可能首先通过 RPC 传输到后端服务,然后是数据库本身。然后会出现处理文件清理、重试、前端服务器崩溃、内存管理等问题。所有这些都是可行的,但如果可以在客户端完成,我可以更快地推出解决方案。
  • 试试这个:stackoverflow.com/a/12056417/551744。我用 JavaScript 实现了拆分文件并在服务器端合并它们。这也有帮助:html5rocks.com/ru/tutorials/file/dndfiles

标签: javascript flash file-upload applet


【解决方案1】:

你可以试试Plupload。它可以配置为检查用户端可用的任何运行时,无论是 Flash、Silverlight、HTML5、Gears 等,并首先使用满足所需功能的任何一个。除其他外,它还支持图像大小调整(在用户端,保留 EXIF 数据(!))、流和分段上传以及分块。文件可以在用户端分块,并逐块发送到服务器端处理程序(需要在服务器上额外注意),以便可以将大文件上传到最大文件大小限制设置为低得多的值的服务器然后他们的大小,例如。还有更多。

我相信有些运行时支持 https,有些需要测试。无论如何,这些天那里的开发人员反应迅速。所以你至少可以试试;)

【讨论】:

    【解决方案2】:

    我所知道的唯一允许这样做的选项是签名的 Java 小程序。

    未签名的小程序和 Flash 电影没有文件系统访问权限,因此它们无法读取文件数据。 Flash 能够上传文件,但其中大部分是由内置 Flash 实现处理的,据我所知,文件内容永远不会暴露给您的代码。

    【讨论】:

    • 从 Flash Player 10 中,您可以使用 ActionScript 读取文件数据:mikechambers.com/blog/2008/08/20/…
    • 有趣。我没有意识到他们已经添加了。
    • 我已经“成功地”使用 FileReference 在 Flash 中实现了分块文件上传。我说“成功”是因为闪存必须将整个文件读入内存。上传一个 700MB 的文件会使 flash 在上传开始前 30 秒内无响应。
    • Flash 是否真的在上传之前将整个文件读入内存?从来没有听说过。有没有描述这个问题的文档?
    • 我不确定你在plupload homepage 上的回答,你可以读到Flash 版本能够进行文件分块。
    【解决方案3】:

    没有适用于该浏览器选择的 JavaScript 解决方案。有File API,但是虽然它可以在较新的 Firefox 和 Chrome 版本中使用,但它不会在 IE 中发生(在 IE9 测试版中也没有迹象)。

    无论如何,在本地读取文件并通过 XMLHttpRequest 上传是低效的,因为 XMLHttpRequest 没有发送纯二进制的能力,只能发送 Unicode 文本。您可以使用 base-64 将二进制编码为文本(或者,如果您真的很专注,可以使用您自己的自定义 7 位编码),但这会比普通文件上传效率低。

    您当然可以使用 Flash 进行上传(请参阅 SWFUpload 等),如果必须的话,甚至可以使用 Java(Jumploader...不过,这些天我不会打扰,因为 Flash 的普及率非常高,而且Java 插件继续下降)。您不一定会获得将低级控件拆分为块的功能,但是您真的需要吗?干什么用的?

    另一种可能的方法是使用标准的 HTML 文件上传字段,并在提交发生时设置一个间隔调用以使用 XMLHttpRequest 轮询服务器,询问文件上传的进度。这需要在服务器端做一些工作来将当前的上传进度存储在会话或数据库中,以便另一个请求可以读取它。这也意味着使用一个表单解析库,它可以为您提供进度回调,而大多数标准语言的内置语言(如 PHP)都没有。

    无论您做什么,都采用“渐进式增强”方法,让不支持的浏览器退回到纯 HTML 上传。浏览器通常都有一个用于 HTML 文件上传的上传进度条,只是它往往很小而且很容易错过。

    【讨论】:

    • Flash 做不到。它具有文件上传功能,但上传内容对客户端代码是隐藏的。无法访问实际的文件数据。未签名的 Java 小程序可能也做不到。我相当肯定您需要使用签名的 Java 小程序。
    • 嗯,工作中 IE(6 和 7)底部的那个栏非常具有误导性:当我发送大文件(通常为 10-50 MB)时,该栏已满方式 早于文件上传实际结束。
    • 是的。它肯定有问题,尤其是在 IE 中。有点可悲的是,如何在绕过 HTML 文件上传控制方面付出了如此多的努力,而浏览器供应商通过一些工作使他们现有的 UI 变得更好一点就可以更容易地解决这个问题。
    【解决方案4】:

    您是否特别需要它两个在 X 块中?或者您是否正在尝试解决上传大文件导致的问题? (例如,无法在客户端重新开始上传,当整个文件一次上传并保存在内存中时服务器端崩溃)

    搜索流式上传组件。这取决于您使用的技术以及您更喜欢 jsp、asp.net 等的组件。

    http://krystalware.com/Products/SlickUpload/这个是服务器端产品 这里有更多关于各种上传者的指针http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx

    一些尝试管理服务器上的内存,例如所以整个大文件一次都不会在内存中,有些人会尝试管理客户端体验。

    【讨论】:

    • SlickUpload 等“流式上传组件”背后的前端技术是什么?他们能够在上传之前对文件进行操作吗?
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2015-12-22
    • 2011-09-06
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多