我已经在几个网站上讨论过这个问题,使用了上面介绍的一些技术,还有一些没有.好消息是,允许大规模上传实际上是非常现实的.
这在很大程度上取决于你上传文件后实际计划如何处理它...你对文件做的工作越多,你就越希望它离你的服务器越近.如果您需要对上传进行即时处理,您可能希望使用纯rails解决方案.如果你不需要做任何处理,或者它不是时间关键的,你可以开始考虑"混合"的解决方案…
信不信由你,事实上,我只用了mod_porter就很幸运了.Mod_porter让apache做了一系列你的应用程序通常会做的工作.它有助于在上传过程中不占用线程和大量内存.它会生成应用程序本地的文件,以便于处理.如果你注意处理上传文件的方式(比如流),你可以让整个过程使用很少的内存,即使是传统上相当昂贵的操作.这种方法只需要对应用程序进行很少的实际设置就可以开始工作,也不需要对代码进行真正的修改,但它确实需要特定的环境(apache服务器)以及配置它的能力.
我还很幸运地使用了jQuery-File-Upload,它支持像分块和可恢复上传这样的好东西.如果没有mod_porter之类的工具,在上传过程中仍然会占用整个执行线程,但如果操作正确,在内存上应该是不错的.这也会导致文件"关闭",因此易于处理.这种方法需要对视图层进行调整才能实现,并且不能适用于所有浏览器.
您提到FTP和bittorrent是可能的选项.这些选项并不像你想象的那么糟糕,因为你仍然可以把文件放在离服务器很近的地方.它们甚至不是互斥的,这很好,因为(正如您指出的)它们确实需要一个额外的客户端,该客户端可能存在于上传机器上,也可能不存在于上传机器上.其工作方式基本上是,你为他们设置一个可以被你的应用程序看到的区域.然后,如果需要进行任何处理,可以运行cron作业(job)(或其他什么)来监视该位置的上传,并触发服务器的处理方法.这并不能让您获得上述方法所能提供的即时响应,但您可以将间隔设置为足够小,以便非常接近.这种方法唯一真正的优点是,所使用的协议更适合传输大型文件,根据我的经验,额外的客户需求和零碎的流程通常超过了从中获得的任何好处.
如果您根本不需要任何处理,那么最好的 Select 可能是直接使用S3.这个解决方案在您实际需要对文件执行任何操作时就会失败,而不是将其作为静态assets资源 进行服务器处理....
我没有在rails应用程序中使用HTML5文件系统API的任何经验,所以我不能说这一点,尽管这似乎会极大地限制您能够支持的客户端.
不幸的是,没有一个真正的灵丹妙药——所有这些选项都需要根据您试图实现的目标与您的环境进行权衡.例如,您可能无法配置web服务器或永久写入本地文件系统.值得一提的是,我认为jQuery文件上传可能是大多数环境中最好的 Select ,因为它实际上只需要修改应用程序,所以您可以最轻松地将实现转移到另一个环境.