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