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

我知道,为了传输这种大小的文件,需要将其分解成更小的部分,我做了一些研究,以下是我迄今为止所做的.

  • 服务器端配置将需要接受大型POST请求,可能需要64位机器来处理anything over 4Gb.
  • AWS支持multipart upload.
  • HTML5 FileSystemAPI有一个持久上传器,可以分块上传文件.
  • 一个可容纳Bitorrent人的库,尽管这需要一个传输客户端,但这并不理想

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

在我列出的这些方法中,我想了解哪些方法效果良好,以及是否还有其他方法我可能遗漏?如果可能,没有插件,最好不要使用Java小程序或Flash.另一个问题是,这些解决方案在上传文件时会将文件保存在内存中,这也是我希望尽可能避免的限制.

推荐答案

我已经在几个网站上讨论过这个问题,使用了上面介绍的一些技术,还有一些没有.好消息是,允许大规模上传实际上是非常现实的.

这在很大程度上取决于你上传文件后实际计划如何处理它...你对文件做的工作越多,你就越希望它离你的服务器越近.如果您需要对上传进行即时处理,您可能希望使用纯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 ,因为它实际上只需要修改应用程序,所以您可以最轻松地将实现转移到另一个环境.

Ruby-on-rails相关问答推荐

将参数传递给视图中的嵌入操作时遇到问题

ArgumentError 用于 Ruby on Rails 中非常简单的初始化方法,没有参数

如何在 Arel 中重用单个绑定变量?

Ruby on Rails 有没有好的管理生成器?

在 Rails 中找不到关联问题

如何验证 ActiveRecord 中邮箱字段的格式?

如何检测导致 Rake 中的弃用警告的原因

为什么 Ruby on Rails 使用 http://0.0.0.0:3000 而不是 http://localhost:3000?

用户注册时设计确认令牌无效

Ruby on Rails i18n - 想要在模型中翻译自定义消息

如何打印出范围之间的随机数?

Mongoid OR 查询语法

Dotenv 多行变量

Ruby on Rails 3:通过 Rails 将数据流式传输到客户端

如何在 Rails 迁移中判断数据库类型?

错误:无法在 Mavericks 上构建 gem 原生扩展

Ruby on Rails:如何在 select_tag 中使用默认占位符?

何时(如果)合并 ActiveRecord 迁移?

Rails:如何在rails中使用dependent::destroy?

Date.current 和 Date.today 有什么区别?