11

avatarペーパークリップが付いたモデルがあります。今では明白な標準パスがあります

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

難読化されたものに移動する必要があります

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

すべてが新しい画像で正常に機能していますが、S3に保存されている既存のファイルを新しいパス形式に移行するにはどうすればよいですか?つまり、名前を変更しますか?

ペーパークリップ2.7とレール3.2を使用しています

ありがとう !!!

4

3 に答える 3

14

Paperclipだけで作業したいが、再アップロードについて心配していない場合は、別のアプローチに従いました。

あなたが次のものを持っているとしましょう:

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に、またはその逆に移行する場合にも完全に機能します。

于 2016-03-15T09:18:42.343 に答える
4

このレーキタスクでうまくいくはずです。aws-sdk1.5.2とruby1.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

新しいファイルが正しいことを確認したら、元のファイルを手動で削除するか、同様のタスクを使用して削除する必要があります。

于 2012-06-07T18:56:54.553 に答える
0

rakeタスク(または、必要に応じて、railsコンテキストで実行するための単純なスクリプト)を作成します。aws-s3 gemを使用している場合は、古いパス形式であることがわかっているモデルのインスタンスを反復処理するか、ファイル名に条件を書き込んでそれらに一致させ、1つずつ移動してみてください。

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-s3gemのドキュメントを読んで、S3アカウントへの接続を確立する方法を確認できます。

于 2012-04-26T16:54:05.390 に答える