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