我曾在几个网站上遇到这个问题,使用了你上面介绍的一些技巧以及其他一些未提到的技巧。好消息是,实际上允许大规模上传文件是相当现实的。
很多取决于你上传文件后实际要做什么...你需要对文件进行更多处理,就越接近你的服务器。如果你需要对上传文件进行即时处理,你可能需要使用纯Rails解决方案。如果不需要进行任何处理,或者它不是时间关键性的,则可以开始考虑“混合”解决方案...
信不信由你,我实际上使用mod_porter非常成功。 Mod_porter使Apache完成应用程序通常执行的一系列任务。它有助于在上传期间不占用线程和大量内存。它会生成一个本地文件,便于处理。如果您注意处理上传的文件的方式(考虑流),即使对于传统上相当昂贵的操作,整个过程也可以使用非常少的内存。这种方法只需要非常少的实际设置才能使应用程序正常工作,并且无需实际修改您的代码,但它确实需要特定的环境( Apache服务器)以及配置的能力。
我也使用jQuery-File-Upload非常成功,它支持分块和可恢复上传等好的功能。如果没有像mod_porter这样的东西,即使在上传期间,它仍然可以占用整个执行线程,但如果正确执行,它应该对内存有不错的表现。这也会生成一个“接近”的文件,因此易于处理。这种方法需要调整您的视图层来实现,并且不能在所有浏览器中使用。
您提到FTP和BitTorrent作为可能的选项。这些选项并不像您想象的那样糟糕,因为您仍然可以将文件获取得非常接近服务器。它们甚至不是相互排斥的,这很好,因为(正如您指出的那样)它们需要另一个可能不存在于上传计算机上的客户端。基本上,这是通过设置一个区域将它们导出,并且该区域对您的应用程序可见来实现的。然后,如果您需要进行任何处理,您可以运行cron作业(或任何其他方法)监视上传位置以触发服务器的处理方法。这不能让您获得以上方法所能提供的即时响应,但是您可以将间隔设置得足够小以获得非常接近的时间。这种方法唯一的真正优势是所使用的协议更适合传输大型文件,但从我的经验来看,额外的客户端需求和分段过程通常会超过任何好处。
如果您根本不需要进行任何处理,则最好的选择可能是直接将它们放在S3上。除了将它们作为静态资源提供之外,这种解决方案也会失败....
我没有在Rails应用程序中使用HTML5 FileSystemAPI的经验,因此无法对此发表评论,尽管似乎它会显着限制您能够支持的客户端。
不幸的是,并没有真正的万能药 - 所有这些选项都需要在您尝试实现的环境中进行权衡。例如,您可能无法配置Web服务器或永久写入本地文件系统。值得一提的是,在大多数环境中,我认为jQuery-File-Upload可能是您最好的选择,因为它只需要对您的应用程序进行修改,因此您可以最轻松地将实现移动到另一个环境。