2016-04-15 47 views
0

我想從遠程存儲服務(而不是s3 :-))使用Ruby on Rails 4.2流客戶端的文件。遠程文件流到客戶端在ruby/rails 4 /獨角獸/ nginx

我的服務器需要停留在事物的中間來驗證客戶端請求,但也建立了對遠程存儲服務的請求,因爲對該服務的所有請求都需要使用自定義標頭參數進行驗證。這使得不可能做一個簡單的redirect_to並讓客戶端直接下載文件(但是讓我知道這是否實際上可能使用rails!)。另外我想保留文件的隱藏URL爲客戶端。

到目前爲止,我使用的是名爲ZipLine的gem,但這也不起作用,因爲在將遠程文件發送到客戶端之前,它仍然會對其進行緩衝。當我使用獨角獸/ nginx時,這可能是由於這兩者中的任何一個設置造成的,這阻止了正確的流式傳輸。

按軌道文檔的說明我已經嘗試添加

listen 3000, tcp_nopush: false 

到config/unicorn.rb但無濟於事。

一個解決方案可能是在本地緩存遠程文件一段時間,並提供該文件。這將使得一些事情變得簡單,而且創造新的麻煩一樣保持同步遠程和緩存文件,設置正確的觸發緩存過期等

所以總結起來:

1)如何實現上面的情況?

2)如果這不是一種智能/有效的做事方式,我應該只是緩存一個遠程副本?

3)在特定情況下您有什麼經驗/建議?

我遇到了各種圍繞interweb散佈的解決方案,但都沒有激發出完整的解決方案。

謝謝!

+0

嗨Corstiaan,您現在可能已經找到了解決方案。我遇到了同樣的問題。這裏是我的線程:https://stackoverflow.com/questions/45714918/download-as-attachment-not-streaming然而,關於zipline它確實爲我工作。我使用Paperclip和S3 – Maxence

回答

1

我假設您的第三方存儲服務具有HTTP訪問權限。如果您確實考慮使用redirect_to,我認爲該服務還提供了允許每次下載授權的方法。與過期標題中的唯一密鑰一樣,不會以過期時間作爲參數公開您的密鑰api密鑰或HMAC簽名的URL。

無論如何,大多數雲存儲服務提供這種文件訪問。我強烈建議讓服務流文件。您的應用只需授權用戶並重定向到該服務。 Rails允許您在重定向時添加自定義標頭。它在Rails guides中討論。

10.2.1設置自定義頁眉

如果你想設置自定義標題的迴應則response.headers 是做它的地方。 headers屬性是一個散列,它將 標題名稱映射到它們的值,Rails將自動設置它們中的一些 。如果要添加或更改標題,只要給它分配給 response.headers

所以,你的動作代碼將結束是這樣的:

def download 
    # do_auth_check 

    response.headers["Your-API-Auth-Key"] = "SOME-RANDOM-STRING" 
    redirect_to url 
end 

不要使用不必要起來服務器資源通過通過他們所有的下載流。我們正在爲此支付雲服務:)

+0

感謝@Uzbekjon,但不會將身份驗證密鑰暴露給客戶端嗎? – Corstiaan

+0

對文件的請求必須使用POST進行。這將排除redirect_to,正確嗎? – Corstiaan

+0

重新驗證密鑰,這取決於您在存儲服務上如何驗證下載。例如,s3允許使用不包含任何密鑰數據的獨特散列進行下載。所以,你應該看到你的存儲文檔。 如果你必須做POST,那麼是的,它幾乎排除'redirect_to'。 – Uzbekjon