Paperclip如何更改basename(文件名)?

时间:2012-03-07 18:07:08

标签: ruby-on-rails ruby ruby-on-rails-3 paperclip

我正在尝试更改照片的基名(文件名):

在我的模特中,我有:

  attr_accessor :image_url, :basename

  has_attached_file :image,
          :styles => { :original => ["300x250>", :png], :small => ["165x138>", :png] },
          :url  => "/images/lille/:style/:id/:basename.:extension",
          :path => ":rails_root/public/images/lille/:style/:id/:basename.:extension"
before_save :basename
private

  def basename
  self.basename = "HALLLO"
  end

但文件名根本没有改变。

4 个答案:

答案 0 :(得分:4)

如果您直接指定文件,可以执行以下操作:

photo.image = the_file
photo.image.instance_write(:file_name, "the_desired_filename.png")
photo.save

答案 1 :(得分:3)

我这样做是为了剥离空格:

before_post_process :transliterate_file_name

private
def transliterate_file_name
  self.instance_variable_get(:@_paperclip_attachments).keys.each do |attachment|
    attachment_file_name = (attachment.to_s + '_file_name').to_sym
    if self.send(attachment_file_name)
      self.send(attachment).instance_write(:file_name, self.send(attachment_file_name).gsub(/ /,'_'))
    end
  end
end

我希望这会对你有所帮助。

编辑:

在你的例子中:

def basename
  self.image_file_name = "foobar"
end

应该做的工作。 (但可能会重命名方法;))

答案 2 :(得分:1)

我希望避免向每个带附件的模型添加before_create回调。我看了at the source,在撰写本文时,它看起来像是:

module Paperclip
  class Attachment
  ...
    def assign_file_information
      instance_write(:file_name, cleanup_filename(@file.original_filename))
      instance_write(:content_type, @file.content_type.to_s.strip)
      instance_write(:file_size, @file.size)
     end

所以你可以修补cleanup_filename

配置/初始化/ paperclip.rb

module Paperclip
 class Attachment
   def cleanup_filename(filename)
     "HALLLO"
   end
  end
 end

答案 3 :(得分:1)

现在,Paperclip允许您在设置has_attached_file时传入FilenameCleaner对象。

您的FilenameCleaner对象必须以{1}}作为唯一参数响应call。如果在设置restricted_characters时提供了has_attached_file选项,则默认的FilenameCleaner会删除无效字符。

所以它看起来像:

has_attached_file :image,
                  filename_cleaner: MyRandomFilenameCleaner.new
                  styles: { thumbnail: '100x100' }

MyRandomFilenameCleaner将是:

class MyRandomFilenameCleaner
  def call(filename)
    extension = File.extname(filename).downcase
    "#{Digest::SHA1.hexdigest(filename + Time.current.to_s).slice(0..10)}#{extension}"
  end
end

您可以通过传递具有self.call方法而不是对象的类来逃避,但这符合Attachment.rb中的Paperclip文档。