在rails应用程序中处理大file upload的最佳方法是什么?

我有兴趣了解在Rails应用程序2-5Gb文件中处理大file upload的不同方法。

我知道,为了传输这个大小的文件,需要将它分解成更小的部分,我已经做了一些研究,这是我迄今为止所做的。

  • 服务器端configuration将需要接受大的POST请求,可能是一个64位的机器来处理超过4Gb的任何东西 。
  • AWS支持分段上传。
  • HTML5 FileSystemAPI有一个持久的上传器,可以以块的forms上传文件。
  • Bitorrent的一个库,虽然这需要一个不理想的传输客户端

所有这些方法都可以恢复像FTP一样,我不想使用FTP的原因是我想保留在Web应用程序,如果这是可能的? 我已经使用carrierwave和回形针,但我正在寻找的东西,将可以恢复上传5Gb文件可能需要一些时间!

我列出的这些方法中,我想说明哪些方法运作良好,如果还有其他方法可能会丢失? 如果可能的话,没有插件,宁可不使用Java Applets或Flash。 另一个问题是,这些解决scheme在上传时将文件保存在内存中,如果可能的话,这也是一个我宁愿避免的限制。

我已经在几个网站上处理了这个问题,使用了上面介绍的一些技术和几个你没有的技术。 好消息是,允许大量上传实际上是相当现实的。

这很大程度上取决于您在上传文件后实际打算如何处理文件…您需要对文件做的工作越多,就越需要将file upload到服务器上。 如果你需要立即处理上传,你可能想要做一个纯粹的铁轨解决scheme。 如果你不需要做任何处理,或者它不是时间关键的,你可以开始考虑“混合”解决scheme…

信不信由你,我已经使用mod_porter运气了。 mod_porter使得apache做了一大堆你的应用通常会做的工作。 它有助于在上传过程中不会绑定一个线程和一堆内存。 它会在您的应用程序中生成一个本地文件,以便于处理。 如果您注意处理上传文件的方式(思考stream),则可以使整个过程使用很less的内存,即使是传统上相当昂贵的操作。 这种方法只需要很less的实际设置来让你的应用程序工作,并且不需要对代码进行真正的修改,但是它确实需要特定的环境(apache服务器)以及configuration它的能力。

我也使用jQuery-File-Upload来祝你好运,它支持像分块和可恢复上传的好东西。 如果没有像mod_porter这样的东西,在上传过程中,这仍然可以占用整个执行线程,但是如果正确的话,它在内存上应该是不错的select。 这也会导致文件“closures”,从而易于处理。 这种方法将需要调整您的视图层来实现,并不会在所有浏览器中工作。

你提到了FTP和BitTorrent作为可能的select。 这些并不像您想象的那样糟糕,因为您仍然可以将文件接近服务器。 它们甚至不互相排斥,这是很好的,因为(正如你所指出的),它们确实需要额外的客户端,可能会或可能不会出现在上传机器上。 这种方式的工作原理是,基本上,你设置一个区域,让他们转储到你的应用程序可见。 然后,如果您需要进行任何处理,您可以运行一个cron作业(或其他)来监视该位置以进行上传,并触发您的服务器处理方法。 这并不能让你立即回应以上的方法,但你可以设置的时间间隔足够小,可以非常接近。 这种方法的唯一真正的优点是所使用的协议更适合于传输大型文件,根据我的经验,额外的客户端要求和零散的进程通常超过了任何好处。

如果你根本不需要任何处理,最好的办法就是直接去S3。 这个解决scheme落在第二个你实际上需要做的任何事情与服务器以外的其他文件作为静态资产….

我在使用Rails应用程序中的HTML5 FileSystemAPI方面没有任何经验,所以我不能说到这一点,尽pipe它似乎会大大限制您能够支持的客户端。

不幸的是,没有一个真正的银弹 – 所有这些选项都需要根据你的环境来衡量你正在努力完成的任务。 例如,您可能无法configurationWeb服务器或永久写入本地文件系统。 对于什么是值得的,我认为jQuery-File-Upload可能是在大多数环境中最好的select,因为它只需要修改应用程序,所以您可以最轻松地将实现移到另一个环境。

我会绕过rails服务器,并将您的大文件(分割成块)直接从浏览器发布到Amazon Simple Storage 。 看看这篇文章用JavaScript分割文件。 我有点好奇这个设置的性能如何,我觉得这个周末要修改这个设置。

我认为Brad Werth肯定了答案

只有一种方法可以直接上传到S3(即使你需要一些后处理,你可以理论使用aws lambda来通知你的应用程序…但老实说,我只是猜测在这里,我即将解决同样的问题,我会在稍后扩展)

http://aws.amazon.com/articles/1434

如果你使用carrierwave

这个项目是一个HTTP协议的新协议,支持大文件的可恢复上传。 它通过提供自己的服务器绕过Rails。

http://tus.io/