不同文件类型的载波文件上传

Carrierwave file upload with different file types

我的 FileUploader 如下:

class FileUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  version :thumb, if: :image? do
    # For images, do stuff here
  end

  version :preview, if: :pdf? do
     # For pdf, do stuff here
  end

  protected

  def image?(new_file)
    new_file.content_type.start_with? 'image'
  end

  def pdf?(new_file)
    new_file.content_type.start_with? 'application'
  end

end

我从载波 github 页面上得到了这个。它主要工作,但如果我不想要不同的版本怎么办?如果它是 pdf,我基本上只想执行某些过程,如果它是图像,我只想执行某些过程。将来我也可能允许其他类型的文件,所以如果我也能有一个简单的方法来做到这一点,那就太棒了。

举个例子,如果是图片,我可能想使用 imgoptim,如果是 pdf,我可能想使用 pdf 优化库,等等。

我试过了:

if file.content_type = "application/pdf"
    # Do pdf things
elsif file.content_type.start_with? 'image'
    # Do image things
end

但出现错误:NameError: (undefined local variable or methodfile' for FileUploader:Class`

该异常表明您正在 Class 级别范围内调用实例变量。 添加调试器断点并打印出 self 你就会明白发生了什么。

解决这个问题的方法是将您的逻辑包装到实例方法中,并将此方法用作默认过程。

process :process_file

def process_file
  if file.content_type = "application/pdf"
      # Do pdf things
  elsif file.content_type.start_with? 'image'
      # Do image things
  end
end

通过这样做,您可以摆脱不需要的版本,并根据 mime 类型处理您想要的任何内容。

尝试在 process 中使用 if,例如

process :action, :if => :image?

相关: Conditional versions/process with Carrierwave

你应该尝试这样使用

class FileUploader < CarrierWave::Uploader::Base  
  include CarrierWave::MiniMagick

  process :process_image, if: :image?
  process :process_pdf, if: :pdf?

  protected

  def image?(new_file)
    new_file.content_type.start_with? 'image'
  end

  def pdf?(new_file)
    new_file.content_type.start_with? 'application'
  end

  def process_image
    # I process image here
  end

  def process_pdf
    # I process pdf here
  end
end