如何使用paperclip处理多种文件类型

时间:2014-04-18 19:53:35

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 paperclip

如何使用单个回形针字段来处理不同的文件类型。例如,我有一个带有回形针方法的文件模型,上面写着:

has_attached_file :file

此文件可以是图片,音频,视频或文档。

如果是图片,我怎样才能使has_attached_file :file能够以这种方式处理图片:

has_attached_file :file, styles: {thumb: "72x72#"}

然后,如果它是其他文档类型,它将在没有样式的情况下正常工作,因此我不必为不同的文件类型创建字段。

2 个答案:

答案 0 :(得分:6)

您处理条件样式的方式是使用lambda来确定您要处理的内容类型。我们之前使用早期版本的Rails / Paperclip完成了这项工作:

#app/models/attachment.rb
Class Attachment < ActiveRecord::Base
    has_attached_file :file,
    styles: lambda { |a| a.instance.is_image? ? {:small => "x200>", :medium => "x300>", :large => "x400>"} : {}}  

    validates_attachment_content_type :file, :content_type => [/\Aimage\/.*\Z/, /\Avideo\/.*\Z/]

    private

    def is_image?
        attachment.instance.attachment_content_type =~ %r(image)
    end
end

答案 1 :(得分:4)

感谢Rich Peck的回答,我能用这个解决方案来解决我的问题。

首先使用lambda来处理条件

  has_attached_file :file,
                    styles: lambda { |a| a.instance.check_file_type}

然后我定义了一个名为check_file_type

的自定义方法

在这种方法中,我根据ruby best pratice article

进行了验证并轻松检查
def check_file_type
    if is_image_type?
      {:small => "x200>", :medium => "x300>", :large => "x400>"}
    elsif is_video_type?
      {
          :thumb => { :geometry => "100x100#", :format => 'jpg', :time => 10, :processors => [:ffmpeg] },
          :medium => {:geometry => "250x150#", :format => 'jpg', :time => 10, :processors => [:ffmpeg]}
      }
    else
      {}
    end
  end

并定义了我的is_image_type?is_video_type?来处理视频和图片。

  def is_image_type?
    file_content_type =~ %r(image)
  end

  def is_video_type?
    file_content_type =~ %r(video)
  end

然后我的附件验证现在看起来像这样

validates_attachment_content_type :file, :content_type => [/\Aimage\/.*\Z/, /\Avideo\/.*\Z/, /\Aaudio\/.*\Z/, /\Aapplication\/.*\Z/]

使用这种方法,我现在可以使用一个回形针方法来处理多种文件类型。