覆盖Rails Paperclip插件的content_type

时间:2010-04-05 21:01:11

标签: ruby-on-rails content-type paperclip

我想我有一点鸡蛋问题。我想设置通过Paperclip上传的文件的content_type。问题是默认的content_type仅基于扩展名,但我想将其基于另一个模块。

我似乎能够使用before_post_process

设置content_type
class 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。

1 个答案:

答案 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