注意:如果你是在ActiveRecord或DataMapper上,配置会稍微不同。Carrierwave官方文档介绍了正确的方法,点此进入。
获取:
bundle install
创建第一个上传:
#app/uploaders/image_uploader.rb class ImageUploader < CarrierWave::Uploader::Base # Include RMagick or MiniMagick support: include CarrierWave::MiniMagick # Choose what kind of storage to use for this Uploader: storage :file # 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/images" end end
这段代码是自说明,storage :file指示服务器将图像存储在本地服务器上,store_dir指定位置。
自从文件通过互联网传送,总会过滤传入的文件:
# app/uploaders/image_uploader.rb ... # 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 png gif) end ...
将这种上传置入我们的图像模型:
# app/models/image.rb class Image include Mongoid::Document include Mongoid::Timestamps include Mongoid::Paranoia include Mongoid::Attributes::Dynamic include Rails.application.routes.url_helpers mount_uploader :media, ImageUploader, mount_on: :media_filename end
编辑image_uploader.rb来处理上传的图像:
# app/uploaders/image_uploader.rb #..... process :resize_to_fill => [200, 200] process :convert => 'png' #.....
尝试从Rails控制台创建一个新的图像:
media = File.open("/Users/test/Desktop/image/jpg")
img = Image.new(:media => media)
img.save
上传图像在store_dir下是可用的。然而上传的图像是立即被处理的,并被200×200的图像覆盖。我们没有原始文件的副本留作以后编辑。所以为避免这种情况,我们需要创建多个版本的文件。
# app/uploaders/image_uploader.rb #..... version :thumb do process :resize_to_fit => [100, 100] process :convert => 'jpg' end version :cover do process :resize_to_fit => [240, 180] process :convert => 'jpg' end #.....
下面显示的是上段代码创建两个版本,检查版本由Carrierwave创建:
img.media.versions[:thumb] # returns the thumb image instance img.media.versions[:cover] # returns the cover image instance
你注意到这些图像是瞬间生成的吗?这意味着图像转换发生在同一线程中,并且执行是被阻塞的,直到完成为止。在生产应用中,在同一线程里创建一个图像的多个版本是不受欢迎的。相反,我们应该有条件的处理这种情况。
# app/uploaders/image_uploader/rb #.... version :cover, :if => :is_live? do process :resize_to_fit => [240, 180] process :convert => 'jpg' end def is_live?(img = nil) @is_live end def is_live=(value) @is_live = value end #....










