2014-10-06 49 views
0

我有一個控制器,有三個動作:indexiframeresult。它的工作方式是用戶通過GET請求訪問index操作。這呈現包含表單的視圖。該表單只是一個按鈕,可以POST到result。我的result操作只是呈現包含jQuery進度條和iframe的頁面,其內容爲iframe操作。 iframe操作會執行一些長時間運行的處理,並最終將結果返回到result視圖。 (我需要在iframe中完成此操作的全部原因是result操作會隨着進度條快速返回,因此用戶不會認爲該應用程序崩潰。)Rails:在控制器動作之間傳遞大量數據

以前,表單僅包含一個POST result。在這種情況下,iframe操作會從靜態URL下載一個〜100MB文件並對其進行一些處理,然後使用處理結果更新父頁面(result)。

現在我需要提供上傳文件的過程,而不是始終使用靜態URL進行下載。基本上,如果用戶提供一個文件,使用該文件;否則,請使用靜態URL。我修改了我的表單以接受文件上傳,並且此部分工作正常。我的問題是如何將這個上傳的文件從result傳遞到iframe〜100MB。這次會議太大了。上傳的文件不需要在運行之間保存。

+0

你是在做處理服務器端還是客戶端? – 2014-10-06 21:01:11

+0

服務器端。我想出了一個(臨時的)解決方案,將上傳的文件保存到一個新的文件中,然後通過'session [:something] =「/tmp/my_new_file.zip」將新創建的文件的位置傳遞給我的iframe。 – user1002119 2014-10-06 21:16:19

回答

0

除了實現細節之外,還應該更新一些問題的背景 - 上傳的是哪種文件?你做什麼樣的處理?從最終用戶的角度來看,該系統的目的是什麼?它可以幫助人們瞭解你想要解決的問題。

我正在做一些假設有關係統的目的,在這裏,但這裏是我會怎麼做:

我會上傳文件,並將它們存儲在文件系統中,並創建一個新的記錄指示文件在系統內的位置的數據庫表,以及文件是否被「處理」。您可以使用載波寶石爲:https://github.com/carrierwaveuploader/carrierwave

然後,我會使用某種背景作業工具來做實際處理。因此,上傳文件時,將其添加到「待處理內容隊列」中,然後向用戶返回一條消息,說明「該作業已添加到隊列中進行處理,並且即將完成」。您在數據庫表中保存的行的ID可以用作需要處理文件的標識符。處理完成後,將數據庫中的「已處理」列更新爲true。有幾種寶石從當它涉及到後臺作業的選擇 - 一個流行的是SideKiq - http://sidekiq.org/

在這一點上,它基本上取決於你在如何順利,你想從你的最終用戶的角度進行處理條款。最簡單的情況是:

當您返回消息「作業已添加到隊列中進行處理並很快完成」時,您還可以說「應在幾分鐘內完成」刷新此頁面看看你的工作是否完成「。每次刷新,如果處理完成,你會讓他們知道。

更復雜的方式是:一旦「作業已添加到隊列」頁面顯示,您可以顯示一個計時器記錄多長時間,並使用JavaScript定時器定期向服務器發送AJAX請求每隔幾秒鐘檢查一次工作是否完成。作業完成後,使用AJAX更新頁面以指示該作業。

相關問題