16

保存する前に画像の名前を変更するには、次の方法を使用します。

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

  before_post_process :rename_avatar

画像の名前は現在の時刻で変更されていますが、ファイルタイプは追加されていません。代わりに、1334487964.jpgは1334487964のみ保存されます。

私はそこに何が欠けていますか?:file_nameにはファイル名のみが含まれていると思いました-ファイルタイプは含まれていません

4

3 に答える 3

24

これが私の問題を解決する方法です:

  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
于 2012-04-30T12:32:24.737 に答える
2

Paperclipの使用をお勧めしますのでinterpolates、このリンクはあなたに最適です。 https://wyeworks.com/blog/2009/7/13/paperclip-file-rename

于 2017-04-28T09:48:17.623 に答える
1

私は以前のすべての解決策を試しましたが、うまく機能しません...しかし、私はこの解決策を作成し、すべてのスタイルで機能します

  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_update_file_name = trueオブジェクト呼び出しごとに1回設定すると、レコードが更新されます。

たとえば、クラス名は「アバター」です。

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

これにより、ファイルの名前を変更するチャームが呼び出されます。

注:この「before_save」は使用できますが、問題は、ペーパークリップがファイルシステムにこのファイルを作成しない可能性があることです。

これがお役に立てば幸いです

于 2018-07-23T09:48:38.040 に答える