gpt4 book ai didi

ruby-on-rails - 将回形针 S3 图像迁移到新的 url/路径格式

转载 作者:行者123 更新时间:2023-12-04 17:55:59 26 4
gpt4 key购买 nike

是否有将大量回形针 S3 图像迁移到新的 :url 和 :path 格式的推荐技术?

这是因为升级到rails 3.1后,裁剪后没有显示新版本的拇指(显示以前缓存的版本)。这是因为文件名不再更改(因为在 rails 3.1 中删除了 asset_timestamp)。我在 url/path 格式中使用 :fingerprint,但这是从原始生成的,裁剪时不会改变。

我打算在 url/path 格式中插入 :updated_at,并在裁剪期间更新附件.updated_at,但在实现该更改后,所有现有图像都需要移动到新位置。大约有 50 万张图像需要在 S3 上重命名。

在这一点上,我正在考虑首先将它们复制到新位置,然后部署代码更改,然后移动任何丢失的图像(即在复制后上传),但我希望有更简单的方法......任何建议?

最佳答案

我不得不改变我的回形针路径以支持图像裁剪,我最终创建了一个 rake task帮忙。

namespace :paperclip_migration do

desc 'Migrate data'
task :migrate_s3 => :environment do
# Make sure that all of the models have been loaded so any attachments are registered
puts 'Loading models...'
Dir[Rails.root.join('app', 'models', '**/*')].each { |file| File.basename(file, '.rb').camelize.constantize }

# Iterate through all of the registered attachments
puts 'Migrating attachments...'
attachment_registry.each_definition do |klass, name, options|
puts "Migrating #{klass}: #{name}"
klass.find_each(batch_size: 100) do |instance|
attachment = instance.send(name)

unless attachment.blank?
attachment.styles.each do |style_name, style|
old_path = interpolator.interpolate(old_path_option, attachment, style_name)
new_path = interpolator.interpolate(new_path_option, attachment, style_name)
# puts "#{style_name}:\n\told: #{old_path}\n\tnew: #{new_path}"
s3_copy(s3_bucket, old_path, new_path)
end
end
end
end

puts 'Completed migration.'
end

#############################################################################
private

# Paperclip Configuration
def attachment_registry
Paperclip::AttachmentRegistry
end

def s3_bucket
ENV['S3_BUCKET']
end

def old_path_option
':class/:id_partition/:attachment/:hash.:extension'
end

def new_path_option
':class/:attachment/:id_partition/:style/:filename'
end

def interpolator
Paperclip::Interpolations
end

# S3
def s3
AWS::S3.new(access_key_id: ENV['S3_KEY'], secret_access_key: ENV['S3_SECRET'])
end

def s3_copy(bucket, source, destination)
source_object = s3.buckets[bucket].objects[source]
destination_object = source_object.copy_to(destination, {metadata: source_object.metadata.to_h})
destination_object.acl = source_object.acl
puts "Copied #{source}"
rescue Exception => e
puts "*Unable to copy #{source} - #{e.message}"
end

end

关于ruby-on-rails - 将回形针 S3 图像迁移到新的 url/路径格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com