2013-07-14 47 views
5

在我的Rails應用程序中,我使用Carrierwave在Amazon S3上上傳圖像。我想指出現有的Amazon S3圖像,而不必重新上傳圖像。例如,如果我在http://test.s3.amazonaws.com/image/path/0001/image.jpg上有現有Amazon S3映像,我可以更新映像路徑以指向此映像嗎?我不想使用遠程上傳選項,因爲我真的只想使用已經存在的相同確切圖像(但將其保存在我的記錄的「路徑」屬性中)。carrierwave:指向現有圖像

在控制檯中,我已經試過:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg") 

但這未能覆蓋圖像的路徑。

+0

你怎麼能解決這個問題? – Mohamad

+0

我最終沒有創建新記錄,只是指向原始記錄。 – scientiffic

+0

嗨@scientiffic你找到了解決方案嗎?我很有趣 – medBo

回答

0

我發現,你能真正做到這一點,例如,如果你的mount_uploader:path,則:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg" 
image.save 
+0

感謝您的回覆。正如我在我原來的文章中所提到的,我不想重新上傳文件,我相信這是您使用remote_path_url進行的操作並保存。 – scientiffic

+0

任何你不想重新上傳文件的理由?在我的情況下,它將取代現有的文件,而且速度更快,而不是從本地機器上傳。不幸的是,我沒有看到有沒有這樣做的載波的替代方式。 – shinnyx

+0

我發現重新上傳文件對我的應用來說太慢了。相反,我只是檢測新記錄是否指向另一個圖像並替換視圖中的圖像(而不是我的數據庫中)。 – scientiffic

2

我有點遲到了,但你可以使用Active Record的raw_write_attribute方法是這樣的:

@ image.raw_write_attribute(:路徑, 「http://test.s3.amazonaws.com/image/path/0001/image.jpg」)

+0

據我所知,這不會將值保存到數據庫中,甚至不允許您使用@ image.save將其寫入數據庫,因爲就模型而言,沒有任何保存! – Daniel

3

插嘴,遲到總比不到好!警告:這是針對rails 4的,我現在只在rails 4.1上進行測試。

這是比它應該更難,methinks!這對我來說絕對至關重要的原因是,由於CloudFlare SSL的限制(以及常識),我附加了100MB + MP3文件,這在我的主機上是無法接收的。幸運的是,AWS支持預授權上傳,和我carrierwave來爲我做正確的事:

第1步:獲得carrierwave告訴我哪裏會,如果它可以存儲一個文件:

m.raw_write_attribute('file','file.mp3'); 
url = m.file.url 
signed = aws_presigned_url(url) 

raw_write_attribute做不保存任何內容,只需在設置值時繞過載波。這使得對象的行爲就好像從數據庫中讀取'file.mp3'一樣。然後你可以問Carrierwave「文件在哪裏居住」。然後我直接從客戶端上傳文件到S3。如果這樣做了,我再拍API調用的Rails,執行以下代碼:

m.raw_write_attribute('file','file.mp3'); 
m.update_attribute('file','file.mp3'); 

各地Carrierwave這兩個配對搞定。第一個使得carrierwave認爲'file'列被設置爲'file.mp3',第二個明確地告訴rails將'file.mp3'持久化到DB。由於raw_write_attribute呼叫,Carrierwave允許第二個通過未更改。

2

在我的情況update_columnupdate_columns偉大工作:

model.update_columns file_1: 'filename.txt' 

更新列是逗號:

model.update_column :file_1, 'filename.txt' 

這將不會運行任何回調並設置列filename.txt

當我做model.file_1.url我得到正確的S3網址。