在rails应用程序中处理大型文件上传的最佳方法是什么?

cih*_*cih 39 bittorrent ruby-on-rails http large-file-upload

我有兴趣了解在Rails应用程序中处理大型文件上传的不同方法,2-5Gb文件.

据我所知,为了传输这种大小的文件,需要将其分解为更小的部分,我已经做了一些研究,这是我到目前为止所做的.

可以像FTP一样恢复所有这些方法,我不想使用FTP的原因是,如果可能的话,我想保留在网络应用程序中吗?我已经使用了carrierwave和paperclip,但我正在寻找能够恢复的东西,因为上传5Gb文件可能需要一些时间!

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

Bra*_*rth 34

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

这很大程度上取决于您在上传文件后实际计划对文件执行的操作...您需要对文件执行的工作越多,您希望它越接近您的服务器.如果您需要立即处理上传,您可能想要做一个纯粹的rails解决方案.如果您不需要进行任何处理,或者它不是时间关键的,您可以开始考虑"混合"解决方案......

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

我也很幸运使用jQuery-File-Upload,它支持chunked和resumable uploads等好东西.如果没有类似mod_porter的东西,这仍然可以在上传过程中占用整个执行线程,但如果做得对,它在内存上应该是合适的.这也会导致文件"关闭",因此易于处理.这种方法需要调整您的视图层才能实现,并且不适用于所有浏览器.

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

如果您根本不需要任何处理,最好的选择可能就是直接与他们一起使用S3.这个解决方案落到你实际需要对除了将它们作为静态资产服务器之外的文件做任何事情的第二个....

我没有在rails应用程序中使用HTML5 FileSystemAPI的任何经验,所以我不能说到这一点,虽然它似乎会显着限制你能够支持的客户端.

不幸的是,没有一个真正的银弹 - 所有这些选项都需要在你想要完成的环境中与你的环境进行权衡.例如,您可能无法配置Web服务器或永久写入本地文件系统.对于它的价值,我认为jQuery-File-Upload可能是大多数环境中最好的选择,因为它只需要修改您的应用程序,因此您可以最轻松地将实现移动到另一个环境.


Bmx*_*xer 6

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

http://tus.io/