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

我想更改照片的基名(filename):

在我的模型中,我有:

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 

但文件名根本没有改变。

看看http://trevorturk.wordpress.com/2009/03/22/randomize-filename-in-paperclip/是否可以帮到你

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

 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 

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

如果直接分配文件,则可以执行以下操作:

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

我想避免为每个带附件的模型添加before_create回调。 我看了一下源代码 ,在撰写本文时,它看起来像是:

 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 

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

您的FilenameCleaner对象必须响应call并将filename作为唯一参数。 如果在设置has_attached_file时提供了restricted_characters选项,则默认的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方法而不是对象的类可以逃脱,但这符合Paperclip在Attachment.rb中的文档。