2013-04-04 29 views
7

我想走動使用CarrierWave重組的文件夾結構,我的S3存儲的文件。如何使用CarrierWave重新組織現有的文件夾層次結構?

我來到這裏的一類所有圖像都被上傳到一個名爲/uploads文件夾中現有的Rails應用程序。如果兩個用戶使用相同的文件名上傳不同的圖像,則會造成問題,第二個圖像將覆蓋第一個。爲了解決這個問題,我需要重新組織文件夾根據ActiveRecord對象實例的每個圖像放置在自己的目錄。我們正在使用CarrierWave來管理文件上傳。

老上傳的代碼有以下方法:

def store_dir 
    "uploads" 
end 

我修改的方法,以反映我的新的文件存儲方案:

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

這個新圖像的偉大工程,但打破網址舊圖像。現有的圖像報告其網址爲新的文件夾中時,立即更改模型,而圖像文件仍然存儲在/uploads

> object.logo.store_dir 
=> "uploads/object/logo/133" 

這是不正確的。該物體應在/uploads中報告其徽標。

我的解決辦法是寫一個腳本來移動圖像文件,但我沒有找到CarrierWave正確的方法來移動文件。我的腳本看起來是這樣的:

MyClass.all.each |image| 
    filename = file.name #This method exists in my uploader, returns the file name 
    #Move the file from "/uploads" to "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

我應該在第三行將腳本移動到新的位置?

+1

你有沒有找到解決方案?我有同樣的問題。 – 2013-08-30 03:47:24

+0

這可能不適用於你,除非你使用霧,但這是我找到的最好的解決方案,我一直在尋找很難:http://stackoverflow.com/questions/19038733/need-to-更改-s-storage-directory-of-s3-bucket-carrierwave -f – 2013-12-19 22:25:10

回答

14

警告:這是未經測試的,所以請在測試之前不要在生產中使用。

這裏的東西,一旦你改變了「store_dir」的內容,所有的舊上傳會成爲失蹤。你已經知道了。與S3直接交互似乎是解決這個問題的最明顯的方式,因爲carrierwave沒有移動功能。

可能有效的一件事就是重新「保存」您的上傳並更改'before:store'回調中的'store_dir'路徑。

在你上傳:

#Use the old uploads directory so carriewave knows where the original upload is 
def store_dir 
    'uploads' 
end 

before :store, :swap_out_store_dir 

def swap_out_store_dir 
    self.class_eval do 
    def store_dir 
     "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    end 
end 

然後運行一個這樣的腳本:

MyClass.all.each do |image| 
    image.image.cache! #create a local cache so that store! has something to store 
    image.image.store! 
end 

在此之後,確認該文件已被複制到正確的位置。您將不得不刪除舊的上傳文件。此外,除去一次性使用上傳碼以上,並與新的store_dir路徑替換爲:

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id} " 
end 

我沒有測試過這一點,所以我不能保證它會奏效。請先使用測試數據,看看它是否有效,如果您已取得任何成功,請在此留言。

+0

爲我完美工作。只是瞬間移動了數千個文件。乾杯。 – 2014-01-23 21:59:11

+0

我遇到了replace_script的問題。但是,您可以在不使用載波的情況下替換生產中的文件夾和文件。 – 2015-08-20 00:23:39

相關問題