2013-11-25 44 views
1

我試圖將文件下載分解爲後臺進程。我的資產存儲在S3上。分解文件下載到後臺進程使用Sidekiq

我原來(阻塞)的代碼如下所示

# From DownloadsController#download 

data = open(path) 
send_data(data.read, type: @download.mime_type, filename: @download.file_title) 

所以我已經設置了Redis的和Sidekiq,創造了FielDownloadWorker

class FileDownloadWorker 

    include Sidekiq::Worker 

    def perform(path, mime_type, file_title) 
    data = open(path) 
    # What happens next? 
    end 

end 

這是使用稱爲:

FileDownloadWorker.perform_async(path,@ download.mime_type,@ download.file_title)

如何從工作人員開始下載?

回答

4

你不能。你想要用戶接收文件,對吧?它必須在控制器內部發生,以便控制器可以通過下載響應。如果你想實現的併發嘗試使用線程:如果你決定去與工人的做法

@data = nil 
t = Thread.new { @data = open(path) } 
# ... do other stuff ... 
t.join # wait for download to finish in other thread 
send_data(@data.read, type: @download.mime_type, filename: @download.file_title) 

你可以把它更新數據庫字段或緩存,當下載完成後,則用戶將不得不向您的應用程序發出另一個請求以獲取完成的文件。例如:

  1. 用戶單擊按鈕以啓動下載。
  2. 有消息頁面更新「您的文件下載,刷新頁面在幾秒鐘」
  3. 用戶刷新頁面,你的控制器看到該文件被下載並執行send_data
+0

感謝您的回覆。我試圖做一個非標準的方法嗎?我應該擔心阻止下載? – Undistraction

+1

延遲阻止對工作人員的IO操作是非常標準的。但不是標準的讓工作人員通過下載來回應用戶。工人不能發表迴應。只有控制器可以。一些解決方法就是解決這個問題。 – DiegoSalazar