【问题标题】:Carrierwave: Move version name to end of filename, instead of frontCarrierwave:将版本名称移动到文件名的末尾,而不是前面
【发布时间】:2017-01-04 06:00:57
【问题描述】:

目前使用 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

知道我做错了什么吗?

【问题讨论】:

标签: ruby-on-rails carrierwave fog


【解决方案1】:

只需在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

【讨论】:

  • 感谢我刚刚尝试过的帖子,但它没有按预期工作。文件名不变。我确定要重新启动 rails 等...但是 content_ 和 thumb_ 仍然被添加到文件名的前面...我正在使用 Using carrierwave 1.0.0 -- 想法?
  • 另外,我的存储设置为storage :fog
  • 我的错,我看错了上传者。感谢您的帮助!
  • @AnApprentice Ty 对于这个有趣的问题。我很高兴它对你有所帮助;)
【解决方案2】:

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

我最终为所有内容覆盖了 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

【讨论】:

    【解决方案3】:

    在当前版本的 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 的文件。

    【讨论】:

    • 我认为这不能回答问题,除非我遗漏了什么......
    • 这已经写在载波官方网站上,你想要的是文件名,那个代码会做同样的事情。您现在无法找到解决问题的方法吗?
    • 我想要的是版本“thumb”不在默认的前面位置 thumb_foo.png 但最后像这样:foo_thumb.png
    • 并附加一个文件名 somefile.jpg,您将得到分别名为 original.jpg、original_small.png 和 original_icon.png 的文件。
    • "original_#{model.logo.file.extension}" 在原始位置上,您可以通过从 original_file 解析来放置文件名。
    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多