簡體   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