2012-04-20 41 views
10

我有一個avatar回形針連接模型。它現在有一個簡單的標準路徑回形針+ S3:將現有文件從一種路徑格式遷移到另一種:

has_attached_file :avatar, 
    :path => "/:id-:style-:filename" 

,我需要進入一個模糊的一個

has_attached_file :avatar, 
    :path => "/:id-:hash.:extension" 
    :hash_secret => 'asecuresecret' 

一切都工作正常了新的圖像,但我怎麼遷移存儲在S3到現有的文件新的路徑格式,即重命名他們?

我用回形針2.7和Rails 3.2

謝謝!

+0

對於那些有興趣的人,從散列到非散列更有趣一些,我發現最好的方法是創建一個新的'has_attached_file'來進行遷移。 – 2014-04-19 02:11:36

回答

3

這個耙子任務應該做的伎倆。我用aws-sdk 1.5.2和ruby 1.9.3p194試了一下。

new_key應該映射到您的新回形針路徑。不要忘記根據您的需要設置:acl

namespace :data do 
    desc 'aws images migration' 
    task :migrate_images do |t, args| 
    s3 = AWS::S3.new(:access_key_id => 'XXX', :secret_access_key => 'XXX') 
    bucket = s3.buckets['your-bucket-name'] 
    bucket.objects.each do |object| 
     new_key = object.key.gsub(........) 
     new_object = bucket.objects[new_key] 
     object.copy_to new_object, {:acl => :public_read} 
    end 
    end 
end 

原始文件應該手動刪除或使用類似的任務,一旦你確定新文件是正確的。

+0

用''aws-sdk''測試1。26和紅寶石2.0。謝謝你,對於接受的延遲感到抱歉! – dgilperez 2013-11-18 13:54:43

0

我會寫一個rake任務(如果您願意,可以只是一個普通的腳本,在rails環境中運行)。如果您使用的是aws-s3 gem,請遍歷模型的實例,您知道它們具有舊的路徑格式,或者嘗試在文件名上寫入一些條件以匹配它們,然後逐個移動。

Model.find_in_batches(:batch_size => 500, 
     :conditions => "avatar_filename like 'SOMETHING_MATCHING'") do |o| 
    AWS::S3::S3Object.rename(old_path(o.avatar), o.avatar.url, 'BUCKET_NAME') 
end 

如果您已經使用了新的路徑定義配置的頭像,寫的是可以建立基於化身性質的老路的方法。

您可以閱讀aws-s3 gem文檔here以瞭解如何建立與您的S3帳戶的連接。

9

如果你只想用回形針工作,並且你不擔心重新上傳,我採用了另一種方法。

假設您具備以下條件:

class User 
    has_attached_file :image, path: "/:old_path/:filename" 
    ... 
end 

,並要遷移到新的路徑:"/:new_path/:filename"

我的建議是創建與舊路徑FakeUser,並改變它在用戶模型。

class FakeUser 
    self.table_name = :users 
    has_attached_file :image, path: "/:old_path/:filename" 
    ... 
end 

class User 
    has_attached_file :image, path: "/:new_path/:filename" 
    ... 
end 

現在,您可以編寫以下遷移:

FakeUser.find_each do |fake_user| 
    User.find(fake_user.id).update(image: fake_user.image) 
    fake_user.image.destroy 
end 

然後,您可以刪除fakeUser此模型時完成遷移。

順便說一句,這種方法也可以完美地從本地文件系統遷移到S3,反之亦然。

+3

這對我來說確實有效,我甚至可以通過從真實模型中繼承假模型來簡化它。 'class FakeUser silva96 2016-08-03 14:11:37

+0

非常好的解決方案來遷移所有文件!比我看到的腳本更好。 – 2017-07-27 11:56:19

相關問題