我正在使用Carrierwave,遇到了这个问题:假设项目已经交付,您需要添加一个部分,在该部分中需要以不同的尺寸显示系统中的图像。我不想为系统中已经存在的每个图像重新生成新的尺寸。我希望能够在视图要求时生成(并缓存)它。类似于:" />。如果新的尺寸500x150已经存在,则返回缓存的URL,否则生成它并返回缓存的URL。
我非常喜欢Carrierwave,但不幸的是,它没有任何开箱即用的即时调整大小功能。每个人都说应该很容易添加此功能,但我几乎找不到任何内容。唯一比较接近的是这个上传器https://gist.github.com/DAddYE/1541912。我不得不修改它才能使它工作,所以这是我的版本。
这个版本存在的问题是,当调用re_size("100x100").url时,URL会在实际调整大小的图像创建之前生成并返回,导致页面上出现了损坏的链接,但在任何后续刷新中都会正常显示。
有人获得了更好的结果愿意分享吗? :)
请不要告诉我换用Dragonfly。我正在使用Carrierwave,并且非常喜欢它。而且它与我的项目中的RailsAdmin无缝集成。
我非常喜欢Carrierwave,但不幸的是,它没有任何开箱即用的即时调整大小功能。每个人都说应该很容易添加此功能,但我几乎找不到任何内容。唯一比较接近的是这个上传器https://gist.github.com/DAddYE/1541912。我不得不修改它才能使它工作,所以这是我的版本。
class ImageUploader < FileUploader
include CarrierWave::RMagick
#version :thumb do
# process :resize_to_fill => [100,100]
#end
#
#version :thumb_square do
# process :resize_to_fill => [100,100]
#end
#
#version :full do
# process :resize_to_fit => [550, 550]
#end
def re_size(string_size)
if self.file.nil?
return self
end
begun_at = Time.now
string_size.gsub!(/#/, '!')
uploader = Class.new(self.class)
uploader.versions.clear
uploader.version_names = [string_size]
img = uploader.new(model, mounted_as)
img.retrieve_from_store!(self.file.identifier)
cached = File.join(CarrierWave.root, img.url)
unless File.exist?(cached)
img.cache!(self)
img.send(:original_filename=, self.file.original_filename)
size = string_size.split(/x|!/).map(&:to_i)
resizer = case string_size
when /[!]/ then :resize_to_fit
# add more like when />/ then ...
else :resize_to_fill
end
img.send(resizer, *size)
FileUtils.mv(img.file.file, cached)
#img.store!
end
img
end
def extension_white_list
%w[jpg jpeg gif png]
end
def filename
Digest::MD5.hexdigest(original_filename) << File.extname(original_filename) if original_filename
end
def cache_dir
"#{Rails.root}/tmp/uploads"
end
def default_url
'/general/no-image.png'
end
end
这个版本存在的问题是,当调用re_size("100x100").url时,URL会在实际调整大小的图像创建之前生成并返回,导致页面上出现了损坏的链接,但在任何后续刷新中都会正常显示。
有人获得了更好的结果愿意分享吗? :)
请不要告诉我换用Dragonfly。我正在使用Carrierwave,并且非常喜欢它。而且它与我的项目中的RailsAdmin无缝集成。