我想我有一点鸡蛋问题。我想设置通过Paperclip上传的文件的content_type。问题是默认的content_type仅基于扩展名,但我想将其基于另一个模块。
我似乎能够使用before_post_process
设置content_typeclass Upload < ActiveRecord::Base
has_attached_file :upload
before_post_process :foo
def foo
logger.debug "Changing content_type"
#This works
self.upload.instance_write(:content_type,"foobar")
# This fails because the file does not actually exist yet
self.upload.instance_write(:content_type,file_type(self.upload.path)
end
# Returns the filetype based on file command (assume it works)
def file_type(path)
return `file -ib '#{path}'`.split(/;/)[0]
end
end
但是......我不能将内容类型基于文件,因为Paperclip在after_create之前不会写入文件。
我似乎无法在保存后使用content_type或使用after_create回调设置(甚至回到控制器中)
所以我想知道在保存之前我是否能够以某种方式访问实际的文件对象(假设没有处理器对原始文件做任何事情),这样我就可以在其上运行file_type命令了。或者有一种方法可以在创建对象后修改content_type。
答案 0 :(得分:4)
可能你可以使用upload.to_file
。它为您提供了回形针临时文件(Paperclip::Tempfile
)。它具有path
属性,因此您可以使用
self.upload.instance_write(:content_type,file_type(self.upload.to_file.path)
您可以使用Tempfile
upload.to_file.to_tempfile