2013-02-16 178 views

回答

3

你有兩個選擇,存儲圖像或使用外部源(gravatar)。

如果你打算存儲圖像,你想讓這些圖像公開可用還是私密?如果它們公開可用,則可以將它們存儲在公用文件夾中。

您可以使用類似carrierwave的東西來處理圖像的上傳,版本控制和存儲。

對於公共的東西,我會將文件存儲在公共目錄下的上傳/模型名稱/字段名稱/編號位置。對我而言,這更多是爲了組織目的。

檢查出http://railscasts.com/episodes/253-carrierwave-file-uploads是一個很好的教程。

對於私人圖像,我將商店目錄設置爲公用文件夾以外的內容,並使用該文件在控制器內創建下載操作。這樣,除非通過控制器操作,否則用戶無法下載文件。通過授權(cancan),我可以允許或禁止用戶訪問該特定文件的下載操作(因此使其有點安全)。如果您打算使用像apache或nginx這樣的生產服務器,請確保您設置了用於發送文件的適當處理程序(即x_sendfile)。

+0

CarrierWave上的+1,無處不在。特別適合霧推到S3或類似的。 – Cluster 2013-02-16 22:23:53

2

將圖像存儲在小應用程序目錄中非常普遍。然而,這裏有幾點需要考慮:

  • 您是否預計會有很多用戶?如果你有一百萬用戶,在你的應用程序中存儲每個人的照片會佔用大量內存

  • 你在Heroku上部署嗎?許多RoR應用程序是,如果你部署在Heroku上,它會破壞你的應用程序移動到不同的測試儀時本地存儲的任何文件(並且你通常無法預測何時會發生這種情況)。您可以在這裏閱讀關於臨時文件系統https://devcenter.heroku.com/articles/dynos#isolation-and-security

  • 一般來說,我建議不要在本地存儲所有圖像,因爲在您縮放時重寫代碼會變得很痛苦。我建議您上傳到Amazon S3 Bucket並根據需要下載圖像(並在用戶登錄時緩存它們)。它很有幫助,因爲您可能需要處理圖像處理(例如,調整上傳的圖像大小,創建上傳的圖像的縮略圖版本),並且在後臺進程可以持久訪問這些文件時更容易實現。我已經使用了'aws'寶石和S3庫,並且它非常易於使用,你可以在這裏閱讀更多關於它的信息:​​

  • 但是,如果你打算這是一個小應用程序,不要在Heroku上部署,只需將其保存到本地目錄便可輕鬆且無痛

相關問題