2

我正在将我的项目从带有附件_fu 的 Rails 2 升级到带有载波的 Rails 3。我有一个现有的数据库和文件目录,其中包含使用 attachment_fu 上传的图像。问题是,在 attachment_fu 中,上传的图像在文件名 ( my_image_small.jpg) 的后面附加了图像版本(拇指、小、中等),而在 carrierwave 中,默认值是相反的 ( small_my_image.jpg)。在carrierwave中我会在哪里改变这个?

这是我的文件上传器:

# encoding: utf-8

class FileUploader < CarrierWave::Uploader::Base
  #include UploaderFu
  # Include RMagick or MiniMagick support:

  SMALL_WIDTH = 101 
    MEDIUM_WIDTH = 223
    LARGE_WIDTH = 345

  include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  # include Sprockets::Helpers::RailsHelper
  # include Sprockets::Helpers::IsolatedHelper

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    #{}"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    "#{Rails.root}/public/file_uploads/#{("%08d" % model.id).scan(/..../).join('/')}"
    #{}"#{Rails.root}/public/file_uploads/"
  end

  version :small do
    process :resize_to_fit => [SMALL_WIDTH, 10000]
  end

  version :medium do
    process :resize_to_fit => [MEDIUM_WIDTH, 10000]
  end

  version :large do
    process :resize_to_fit => [LARGE_WIDTH, 10000]
  end




  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process :scale => [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process :scale => [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end

end
4

2 回答 2

5

要覆盖特定版本的文件名约定,您可以full_filename在版本块中定义一个方法:

version :small do
  def full_filename(for_file)
    [super(for_file), version_name].compact.join('_')
  end

  process :resize_to_fit => [SMALL_WIDTH, 10000]
end

该方法只是full_filename对 CarrierWave 源代码中现有方法的重写(请参阅 参考资料versions.rb)。

但是,您需要在每个版本上覆盖它。相反,您可能希望通过修补Versions模块来更改 CarrierWave 的默认行为。您可以将此添加为初始化程序:

module CarrierWave
  module Uploader
    module Versions
      def full_filename(for_file)
        [super(for_file), version_name].compact.join('_')
      end
    end
  end
end

更新:

要更正文件扩展名的问题,您可以使用 Rake 的pathmap函数来解析文件名:

require 'rake'
def full_filename(for_file)
  filename  = for_file.pathmap("%n")
  extension = for_file.pathmap("%x")
  [filename, version_name].compact.join('_') + extension
end
于 2013-04-22T17:35:05.877 回答
0

万一有人想知道我是怎么想出来的,我查看了 gem 代码,发现文件名是由 设置的def full_filename,所以在我的 FileUploader 中我重写了该方法,以便它覆盖行为。

def full_filename (for_file = model.filename.file)      
  "#{for_file[/(.+)\./][$1]}_#{version_name}.#{for_file[/\.(.+)/][$1]}"
end
于 2013-04-22T19:44:06.430 回答