安装
安装最新稳定版
[sudo] gem install carrierwave
下面代码加入 Gemfile
gem 'carrierwave'
重启 server
CarrierWave 0.5 不兼容 Rails 2,如果你使用的是 Rails 2,请使用 github 仓库中的 CarrierWave 0.4-stable 分支
开始使用
生成一个 uploader
rails generate uploader Avatar
将会生成下面文件
app/uploaders/avatar_uploader.rb
使用 uploader 类接收和保存文件
uploader = AvatarUploader.new
uploader.store!(my_file)
uploader.retrieve_from_store!('my_file.png')
这将会保存2个文件,一个永久存储文件和一个临时存储文件。可以使用不同的存储方式,文件系统或者云存储。
多数时候 CarrierWave 会合 ORM 一起使用。在 model 类中挂载 uploader 到列上
ActiveRecord
确认 CarrierWave 已经加载,如果没有加载需要手工加载 CarrierWave (在 Rails 中通常不需要这么做)
require 'carrierwave/orm/activerecord'
添加一个字符串列到 model 中
rails g migration add_avatar_to_users avatar:string
rake db:migrate
把 uploader 挂载到列上面
class User < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
end
可以直接给属性赋值,当保存记录的时候会自动存储文件
u = User.new
u.avatar = params[:file]
u.avatar = File.open('somewhere')
u.save!
u.avatar.url # => '/url/to/file.png'
u.avatar.current_path # => 'path/to/file.png'
u.avatar.identifier # => 'file.png'
改变存储目录
重写 store_dir
方法可以改变存储目录
class MyUploader < CarrierWave::Uploader::Base
def store_dir
'public/my/upload/directory'
end
end
如果要保存在顶级目录,可以给 store_dir
返回 nil
改变缓存文件保存目录
class MyUploader < CarrierWave::Uploader::Base
def cache_dir
'/tmp/projectname-cache'
end
end
安全上传
使用白名单限制上传文件的扩展名
class MyUploader < CarrierWave::Uploader::Base
def extension_white_list
%w(jpg jpeg gif png)
end
end