Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- has_attached_file :image, :styles => { ...... }
- (record.image.styles.keys+[:original]).each do |style|
- path = record.image.path(style)
- FileUtils.move(path, File.join(File.dirname(path), new_file_name))
- end
- record.image_file_name = new_file_name
- record.save
- params[:upload][:md5] = Digest::MD5.file(file.path).hexdigest
- Paperclip.interpolates :md5 do|attachment,style|
- attachment.instance.md5
- end
- validates_attachment_presence :upload
- has_attached_file :upload,
- :path => ':rails_root/public/files/:md5.:extension',
- :url => '/files/:md5.:extension'
- (record.image.styles.keys+[:original]).each do |style|
- AWS::S3::S3Object.move_to record.image.path(style), new_file_path, record.image.bucket_name
- end
- record.update_attribute(:image_file_name, new_file_name)
- class User < ActiveRecord::Base
- after_update :rename_attached_files_if_needed
- has_attached_file :avatar_image,
- :storage => :s3,
- :s3_credentials => "#{Rails.root}/config/s3.yml",
- :path => "/users/:id/:style/:slug.:extension",
- :default_url => "/images/users_default.gif",
- :styles => { mini: "50x50>", normal: "100x100>", bigger: "150x150>" }
- def slug
- return name.parameterize if name
- "unknown"
- end
- def rename_attached_files_if_needed
- return if !name_changed? || avatar_image_updated_at_changed?
- (avatar_image.styles.keys+[:original]).each do |style|
- extension = Paperclip::Interpolations.extension(self.avatar_image, style)
- old_path = "users/#{id}/#{style}/#{name_was.parameterize}#{extension}"
- new_path = "users/#{id}/#{style}/#{name.parameterize}#{extension}"
- avatar_image.s3_bucket.objects[old_path].move_to new_path, acl: :public_read
- end
- end
- end
- def rename(key, new_name)
- file_name = (key.to_s+"_file_name").to_sym
- old_name = self.send(file_name)
- (self.send(key).styles.keys+[:original]).each do |style|
- path = self.send(key).path(style)
- self[file_name] = new_name
- new_path = self.send(key).path(style)
- new_path[0] = ""
- self[file_name] = old_name
- old_obj = self.send(key).s3_object(style.to_sym)
- new_obj = old_obj.move_to(new_path)
- end
- self.update_attribute(file_name, new_name)
- end
- styles = file.styles.keys+[:original]
- old_style2key = Hash[ styles.collect{|s| [s,file.path(s).sub(%r{A/},'')]} ]
- self.file_file_name = new_filename
- new_style2key = Hash[ styles.collect{|s| [s,file.path(s).sub(%r{A/},'')]} ]
- styles.each do |style|
- raise "same key" if old_style2key[style] == new_style2key[style]
- file.s3_bucket.objects[old_style2key[style]].copy_to(new_style2key[style])
- end
- save!
- styles.each do |style|
- file.s3_bucket.objects[old_style2key[style]].delete
- end
- Paperclip::Attachment.default_options.update({
- # :url=>"/system/:class/:attachment/:id_partition/:style/:filename"
- :url=>"/system/:class/:attachment/:style/:fingerprint.:extension"
- })
- :path=>":rails_root/public:url"
- $ rails c --sandbox
- > Paperclip::Attachment.default_options
- ..
- > s = User.create(:avatar => File.open('/foo/bar.jpg', 'rb'))
- ..
- > s.avatar.path
- => "/home/groovy_user/rails_projectes/funky_app/public/system/users/avatars/original/49332b697a83d53d3f3b5bebce7548ea.jpg"
- > s.avatar.url
- => "/system/users/avatars/original/49332b697a83d53d3f3b5bebce7548ea.jpg?1387099146"
- class RenamePhotoColumnFromUsers < ActiveRecord::Migration
- def up
- add_attachment :users, :photo
- # Add `avatar` method (from Paperclip) temporarily, because it has been deleted from the model
- User.has_attached_file :avatar, styles: { medium: '300x300#', thumb: '100x100#' }
- User.validates_attachment_content_type :avatar, content_type: %r{Aimage/.*Z}
- # Copy `avatar` attachment to `photo` in S3, then delete `avatar`
- User.where.not(avatar_file_name: nil).each do |user|
- say "Updating #{user.email}..."
- user.update photo: user.avatar
- user.update avatar: nil
- end
- remove_attachment :users, :avatar
- end
- def down
- raise ActiveRecord::IrreversibleMigration
- end
- end
- def sanitize_filename(filename)
- fn = filename.split /(?<=.).(?=[^.])(?!.*.[^.])/m
- fn[0] = fn[0].parameterize
- return fn.join '.'
- end
- include ApplicationHelper
- Paperclip::Attachment.default_options.update({
- :path => ":rails_root/public/system/:class/:attachment/:id/:style/:parameterize_file_name",
- :url => "/system/:class/:attachment/:id/:style/:parameterize_file_name",
- })
- Paperclip.interpolates :parameterize_file_name do |attachment, style|
- sanitize_filename(attachment.original_filename)
- end
- attr_accessor :avatar_update_file_name
- has_attached_file :avatar,
- :styles => {
- :medium => "288x288#",
- :small => "150x150#",
- :thumb => "48x48#"
- },
- :path => YOUR_PATH + ":style/:basename.:extension",
- :url => YOUR_PATH + ":style/:filename",
- preserve_files: true
- process_in_background :avatar, only_process: [:medium, :small, :thumb, :original]
- after_save :rename_avatars
- def rename_avatars
- if self.avatar_update_file_name == true
- new_file_hash = "#{SecureRandom.urlsafe_base64}"
- new_file_name = ""
- (self.avatar.styles.keys+[:original]).each do |style|
- path = avatar.path(style)
- if(File.file?(path))
- File.chmod(0777, File.dirname(path))
- new_file_name = "#{new_file_hash}.#{extension}"
- FileUtils.move(path, File.join(File.dirname(path), new_file_name))
- end
- end
- self.avatar_update_file_name = false
- self.avatar_file_name = new_file_name
- self.save!
- end
- end
- avatar = new Avatars
- #... upload and work with files
- avatar.avatar_update_file_name = true
- avatar.save!
Add Comment
Please, Sign In to add comment