簡體   English   中英

在ruby / rails 4 / unicorn / nginx中將遠程文件流式傳輸到客戶端

[英]Stream remote file to client in ruby/rails 4/unicorn/nginx

我正在嘗試使用Ruby on Rails 4.2將文件從遠程存儲服務(不是s3 :-))流式傳輸到客戶端。

由於需要使用自定義標頭參數來驗證對該服務的所有請求,因此我的服務器需要停留在中間以便對客戶端請求進行身份驗證,還需要對遠程存儲服務建立請求。 這使得不可能執行簡單的redirect_to並讓客戶端直接下載文件(但是請告訴我,實際上是否可以使用rails!)。 我也想為客戶端保留文件的URL。

到目前為止,我使用的是名為ZipLine的gem,但是它仍然無法正常工作,因為它在將遠程文件發送給客戶端之前仍然會緩沖該文件。 當我使用unicorn / nginx時,這也可能是由於這兩個設置中的一個導致無法正常播放。

按照Rails文檔的說明,我嘗試添加

listen 3000, tcp_nopush: false

配置/unicorn.rb,但無濟於事。

一種解決方案可能是在本地緩存遠程文件一定時間,然后僅提供該文件。 這將使某些事情變得更容易,但同時也會帶來新的麻煩,例如使遠程文件和緩存的文件保持同步,為緩存過期設置正確的觸發器等。

所以總結一下:

1)如何完成上述方案?

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

3)您在給定情況下的經驗/建議是什么?

我遇到了散布在Internet上的各種解決方案,但沒有一個能激發出一個完整的解決方案。

謝謝!

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

無論如何,大多數雲存儲服務都提供了這種文件訪問。 我強烈建議讓服務流式傳輸文件。 您的應用應僅授權用戶並重定向到服務。 Rails允許您在重定向時添加自定義標頭。 Rails指南中進行了討論。

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

不要通過流過所有下載資源來耗盡不必要的服務器資源。 畢竟,我們為此付出了雲服務的費用:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM