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,反之亦然.
这个 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)
一旦确定新文件正确,应手动删除原始文件或使用类似的任务。
| 归档时间: |
|
| 查看次数: |
3572 次 |
| 最近记录: |