2012-04-20 37 views
10

Tôi có một mô hình có đính kèm kẹp giấy avatar. Nó bây giờ có một tiêu chuẩn đường đồng bằngKẹp giấy + S3: Di chuyển các tệp hiện có từ một: định dạng đường dẫn sang một định dạng khác

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

Mà tôi cần phải di chuyển vào một obfuscated một

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

Tất cả mọi thứ của làm việc tốt với những hình ảnh mới, nhưng làm cách nào để di chuyển các tập tin hiện lưu trữ trong S3 đến định dạng đường dẫn mới, tức là đổi tên chúng?

Tôi đang sử dụng kẹp giấy 2.7 và Rails 3.2

Cảm ơn!

+0

Đối với những người quan tâm, di chuyển từ băm sang không băm là thú vị hơn một chút và phương pháp tốt nhất mà tôi tìm thấy là tạo một 'has_attached_file' mới để thực hiện di chuyển. –

Trả lời

3

Nhiệm vụ cào này sẽ thực hiện thủ thuật. Tôi đã thử nó với aws-sdk 1.5.2 và ruby ​​1.9.3p194.

new_key nên ánh xạ tới đường dẫn ghim giấy mới của bạn. Đừng quên đặt :acl theo nhu cầu của bạn.

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 

Tệp gốc phải được xóa thủ công hoặc sử dụng tác vụ tương tự, khi bạn chắc chắn tệp mới là chính xác.

+0

Đã kiểm tra với '' aws-sdk'' 1.26 và ruby ​​2.0. Cảm ơn và xin lỗi vì sự chậm trễ trong việc chấp nhận! – dgilperez

0

Tôi sẽ viết một tác vụ cào (hoặc chỉ là một tập lệnh đơn giản nếu bạn muốn, được chạy trong ngữ cảnh đường ray). Nếu bạn đang sử dụng đá quý aws-s3, hãy lặp lại các phiên bản của mô hình mà bạn biết chúng có định dạng đường dẫn cũ hoặc thử viết một số điều kiện trên tên tệp để khớp với chúng và di chuyển từng cái một.

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 

Nếu bạn đã định cấu hình hình đại diện với định nghĩa đường dẫn mới, hãy viết phương pháp có thể tạo đường dẫn cũ dựa trên thuộc tính hình đại diện.

Bạn có thể đọc tài liệu đá quý aws-s3 here để xem cách thiết lập kết nối với tài khoản S3 của bạn.

9

Nếu bạn chỉ muốn làm việc với Paperclip và bạn không phải lo lắng về việc tải lên lại, tôi đã làm theo một cách tiếp cận khác.

Hãy giả sử bạn có những điều sau đây:

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

và bạn muốn chuyển sang con đường mới: "/:new_path/:filename"

đề nghị của tôi là tạo ra một FakeUser với con đường cũ và thay đổi nó trong tài khoản mô hình.

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 

Bây giờ bạn có thể viết di cư sau:

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

Sau đó bạn có thể xóa các mô hình FakeUser khi di cư kết thúc.

Nhân tiện, cách tiếp cận này cũng sẽ hoạt động hoàn hảo để di chuyển từ hệ thống tệp cục bộ sang S3 hoặc ngược lại.

+3

điều này đã làm việc cho tôi, tôi thậm chí có thể đơn giản hóa nó bằng cách kế thừa mô hình giả từ mô hình thực tế 'lớp FakeUser silva96

+0

Giải pháp rất tốt để di chuyển tất cả các tệp của bạn! Tốt hơn các kịch bản mà tôi đã thấy. –

Các vấn đề liên quan