Paperclip - rename file before saving

后端 未结 3 1263
渐次进展
渐次进展 2020-12-25 08:01

I use this method for renaming the image before the saving:

  def rename_avatar
    self.avatar.instance_write :file_name, Time.now.to_i.to_s
  end

  before         


        
相关标签:
3条回答
  • 2020-12-25 08:45

    This is the way how I fix my issue:

      def rename_avatar
        #avatar_file_name - important is the first word - avatar - depends on your column in DB table
        extension = File.extname(avatar_file_name).downcase
        self.avatar.instance_write :file_name, "#{Time.now.to_i.to_s}#{extension}"
      end
    
    0 讨论(0)
  • 2020-12-25 08:45

    Since Paperclip recommends using interpolates, this link can help you the best. https://wyeworks.com/blog/2009/7/13/paperclip-file-rename

    0 讨论(0)
  • 2020-12-25 09:01

    I have tried all the previous solutions, it doesn't work with me very well... However, I have created this solution and it works with me on all the styles

      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
    

    This will loop on your style every time you save your object and you set avatar_update_file_name = true for one time per object call and it will update your records

    for example, your class name is "Avatars"

    avatar = new Avatars
    #... upload and work with files
    avatar.avatar_update_file_name = true
    avatar.save!
    

    This will invoke the make the file rename charm!

    Note: you can use this "before_save" but the problem is the paperclip might not create this files on the filesystem

    Hope this will helps

    0 讨论(0)
提交回复
热议问题