Paperclip + S3:将现有文件从一种:路径格式迁移到另一种格式

dgi*_*rez 11 migration amazon-s3 paperclip ruby-on-rails-3

我有一个带avatar回形针附件的模型.它现在有一条简单的标准路径

has_attached_file :avatar,
  :path => "/:id-:style-:filename"
Run Code Online (Sandbox Code Playgroud)

我需要进入一个混淆的

has_attached_file :avatar,
  :path => "/:id-:hash.:extension"
  :hash_secret => 'asecuresecret'
Run Code Online (Sandbox Code Playgroud)

一切都可以正常使用新图像,但是如何将存储在S3中的现有文件迁移到新的路径格式,即重命名它们?

我正在使用paperclip 2.7和Rails 3.2

谢谢 !!!

coo*_*sse 13

如果您只想使用Paperclip并且您不担心重新上传,我会采用另一种方法.

我们假设您有以下内容:

class User
   has_attached_file :image, path: "/:old_path/:filename"
   ...
end
Run Code Online (Sandbox Code Playgroud)

并且您想要迁移到新路径: "/:new_path/:filename"

我的建议是FakeUser使用旧路径创建一个并在User模型中更改它.

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
Run Code Online (Sandbox Code Playgroud)

您现在可以编写以下迁移:

FakeUser.find_each do |fake_user|
   User.find(fake_user.id).update(image: fake_user.image)
   fake_user.image.destroy
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以在迁移完成后删除FakeUser模型.

顺便说一句,这种方法也可以完美地从本地文件系统迁移到S3,反之亦然.

  • 这确实对我有用,我甚至可以通过继承真实模型`类FakeUser <User`中的假模型来简化它 (3认同)

str*_*am7 5

这个 rake 任务应该可以解决问题。我尝试使用 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
Run Code Online (Sandbox Code Playgroud)

一旦确定新文件正确,应手动删除原始文件或使用类似的任务。