2012-06-12 120 views
3

我有一個在Heroku上的Carrierwave的應用程序。在一個頁面上,我有兩種形式:1個用於上傳圖片的ajax表單和1個用於創建對象所需的額外信息的常規表單。假設我的Carrierwave安裝爲:picture,每次提交ajax表單時,圖片都會臨時保存到公用文件夾中,並且其路徑返回爲:picture_cache。第二種形式然後使用它來知道在第二個請求中使用新對象創建哪個圖片。這適用於單個測功機。如何在Heroku多個dynos上使用carrierwave緩存?

不同的dynos不知道彼此的文件系統。因此,如果提交第二個表單的請求沒有按照第一個表單的請求命中相同的測試儀,它就無法找到圖像。

有沒有人解決這個問題?

+0

你有沒有解決過這個問題?無需使用Mongoid? – stephenmurdoch

回答

2

我使用自定義模型並將所有文件(包括tmp文件)存儲在mongodb中。上傳標記爲tmp。那些模型是'保存'我只是刪除'tmp'標誌。通過這種方式,所有節點都可以看到所有圖像。 Carrierwave默認緩存在./tmp中是非常瘋狂的,因爲許多多節點配置會看到這個問題(除非平衡器實現了會話關聯)。

這裏是我的模型和控制器等:https://gist.github.com/3161569

你要做的形式一些自定義的工作:

  • 保存發佈,無論每個文件什麼
  • 中繼發佈文件ID在一個隱藏字段
  • 上保存查找文件和/或之前上傳ID
  • 使模型協會

這種方法,雖然它不是「魔力」也給出了以下真棒副作用:

  • 你有一個過程運行的作業在後臺對縮略圖起轉圖片image_magick每當用戶點擊「提交」(這是一個嚴重 DOS載體,尤其在內存有限的主機像Heroku的)

  • 可以遷移的圖像在後臺到S3,每小時,無論和上傳只是有一個新的url(在這種情況下,控制器需要發出一個permanant重定向,如果它注意到這一點)。這是非常好的,因爲你可以在開發,分期等數據庫中保存它們,並且無需更改任何上傳或查看代碼即可將一些或全部上傳到s3上。

+0

如果你不在Mongoid上怎麼樣? – stephenmurdoch

+0

@marflar我相信大多數SQL數據庫也能夠存儲像圖像這樣的二進制數據。如果你使用PG [這個SO-answer](http://stackoverflow.com/questions/14744032/modeling-postgresqls-large-objects-in-rails#id=answer-14754647)和[Large Object interface documentation] (http://www.postgresql.org/docs/9.3/interactive/lo-interfaces.html)可能會對你感興趣。 – Timo

相關問題