Carrierwave:将版本名称移动到文件名的末尾,而不是前面

Carrierwave: Move version name to end of filename, instead of front

目前使用 Carrierwave,在像这样创建不同版本时上传像 foo.png 这样的文件后:

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  storage :fog
  def store_dir
    "#{model.class.to_s.underscore}/#{model.id}"
  end

  version :thumb do
    process :resize_to_fit => [500, 500]
  end
end

导致文件上传为:

thumb_foo.png
foo.png

出于 SEO 原因,我想将 "thumb" 移动到文件名的末尾。根据他们的 docs 这里我补充说:

  def full_filename(for_file)
    if parent_name = super(for_file)
      extension = File.extname(parent_name)
      base_name = parent_name.chomp(extension)
      [base_name, version_name].compact.join("_") + extension
    end
  end

  def full_original_filename
    parent_name = super
    extension = File.extname(parent_name)
    base_name = parent_name.chomp(extension)
    [base_name, version_name].compact.join("_") + extension
  end

文档说这应该导致:

foo_thumb.png
foo.png

然而,我最终得到了以下结果:

thumb_foo_thumb.png
foo.png

知道我做错了什么吗?

在当前版本的 CarrierWave 中,如果您有这样定义的上传器:

class LogoUploader < CarrierWave::Uploader::Base 
  # ... 
  def filename 
    "original_#{model.logo.file.extension}" if original_filename 
  end 
  version :small do 
    process :resize_to_fit => [190, 190] 
    process :convert => 'png' 
  end 
  version :icon do 
    process :resize_to_fill => [50, 50] 
    process :convert => 'png' 
  end 
  # ... 
end

并附加一个文件名 somefile.jpg,您将最终得到分别名为 original.jpg、original_small.png 和 original_icon.png 的文件。

只需在version块下使用#full_filename

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

  storage :file

  version :thumb do
    process resize_to_fill: [50, 50]

    def full_filename(for_file = model.logo.file)
      parts     = for_file.split('.')
      extension = parts[-1]
      name      = parts[0...-1].join('.')
      "#{name}_#{version_name}.#{extension}"
    end
  end
end

结果如下:

/Users/user/app/uploads/1x1.gif
/Users/user/app/uploads/1x1_thumb.gif

如果你有很多版本,接受的答案可能会有点乏味。

我最终覆盖了所有内容的 full_filename,而不是在每个单独的版本定义中。它工作正常。这是 Carrierwave 1.0

photo_uploader.rb

# Override the filename of the uploaded files:
def full_filename(name)
  "#{File.basename(name, '.*')}_#{version_name || 'original'}#{File.extname(name)}"
end

我正在使用内置的 File.basename 和 File.extname 方法,而不是像已接受的答案中那样手动执行(尽管那是我开始的地方并且该代码也可以正常工作)。

注意:我想在未版本化的上传中添加“原始”,这样我的目录列表看起来更干净。那部分可以很容易地删除。

foo_mobile.jpg

foo_original.jpg

foo_square.jpg