我正在尝试更改照片的基名(文件名):
在我的模特中,我有:
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
但文件名根本没有改变。
答案 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
。
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文档。