繁体   English   中英

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

[英]What is the best approach to handle large file uploads in a rails app?

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

我知道为了传输这种大小的文件,它需要分解成更小的部分,我已经做了一些研究,这是我目前所做的。

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

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

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

这在很大程度上取决于您在上传文件后实际计划对文件做什么......您必须对文件做的工作越多,您就越希望它离您的服务器越近。 如果您需要对上传进行立即处理,您可能想要做一个纯 Rails 解决方案。 如果你不需要做任何处理,或者不是时间紧迫,你可以开始考虑“混合”解决方案......

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

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

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

如果您根本不需要任何处理,最好的办法可能是直接与他们一起进入 S3。 该解决方案在您实际上需要对文件做任何事情而不是将它们作为静态资产服务器时就失败了....

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

不幸的是,没有一种真正的灵丹妙药——所有这些选项都需要根据您要完成的工作与您的环境进行权衡。 例如,您可能无法配置 Web 服务器或永久写入本地文件系统。 就其价值而言,我认为 jQuery-File-Upload 可能是您在大多数环境中的最佳选择,因为它只需要修改您的应用程序,因此您可以最轻松地将实现移动到另一个环境。

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

http://tus.io/

http://www.jedi.be/blog/2009/04/10/rails-and-large-large-file-uploads-looking-at-the-alternatives/对选项进行了一些很好的比较,包括一些外部导轨。

请通过它。这对我的情况很有帮助

另一个要访问的站点是:- http://bclennox.com/extremely-large-file-uploads-with-nginx-passenger-rails-and-jquery

如果其中任何一个不起作用,请告诉我

我会绕过 rails 服务器并将您的大文件(拆分成块)直接从浏览器发布到Amazon Simple Storage 看看这篇关于用 JavaScript 分割文件的帖子 我有点好奇这个设置的性能如何,我想在这个周末修改这个设置。

我认为 Brad Werth 给出了答案

只有一种方法可以直接上传到 S3(即使您在理论上可以使用 aws lambda 通知您的应用程序后确实需要一些重新处理...但说实话,我只是在这里猜测,我即将解决我自己也有同样的问题,我稍后会对此进行扩展)

http://aws.amazon.com/articles/1434

如果你使用载波

让我还确定一些可能有助于其他人寻找现实世界解决方案的选项。

我有一个带有 Ruby 2.7 的 Rails 6,这个应用程序的主要目的是创建一个类似谷歌驱动器的环境,用户可以在其中上传图像和视频,然后他们再次处理它们以获得高质量。

显然,我们确实尝试过使用 Sidekiq 后台作业使用本地处理,但在 1GB 或更多的大型上传过程中它是压倒性的。 我们确实尝试过 tuts.io,但我个人认为不像 Jquery 文件上传那样容易设置。

所以我们尝试了 AWS ......按照下面列出的步骤移动,它就像一个魅力......

  • 使用 React drop zone uploader...我们将多个文件上传到 S3。
  • 我们为输入存储桶设置了 Aws Lambda,以触发该存储桶上所有类型的对象创建。
  • 这个 Lambda 会转换文件并再次将重新处理的文件上传到另一个文件 - 输出存储桶,并使用 Aws SNS 通知我们以跟踪哪些工作有效,哪些失败。
  • 在 Rails 方面......我们只是动态地使用新的输出存储桶,然后使用 Aws Cloud-front 分发来提供它。

您可以查看 MediaConvert 上的 Aws 注释以查看分步指南,他们还有一个编写良好的 Github 存储库,用于各种实验。

希望它可以帮助这里的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM