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

时间:2017-01-04 06:00:58

标签: ruby-on-rails carrierwave fog

目前使用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原因,我想将拇指移动到文件名的末尾。基于他们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

知道我做错了吗?

由于

3 个答案:

答案 0 :(得分:2)

只需在#full_filename块下使用version

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

答案 1 :(得分:0)

如果你有很多版本,那么接受的答案会变得有点单调乏味。

我最终覆盖了所有内容的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方法,而不是手动执行,如接受的答案中所示(尽管那是我开始的地方,而且代码工作正常)。< / p>

注意:我想添加&#34;原创&#34;对于无版本上传只是为了使我的目录列表看起来更干净。这部分可以很容易地删除。

  

foo_mobile.jpg

     

foo_original.jpg

     

foo_square.jpg

答案 2 :(得分:-1)

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

var mongoose = require('mongoose');
var assert = require('assert');
var Fruits = require('./models/fruits-1');
var url = 'mongodb://localhost:27017/confusion';
mongoose.connect(url);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function(){
    Fruits.create(
        {
            name: 'Apple',
            description: "It's delicious."
        }, function(err, fruit){
            if(err){
                console.log(err);
            }
            else{
                console.log(fruit);
            }
    });
});

并附上文件名somefile.jpg,你最终会得到名为original.jpg,original_small.png和original_icon.png的文件。