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中的文档。