rails应用使用carrierwave和mini_magick上传用户头像
1. 在Gemfile添加
gem 'carrierwave' gem 'mini_magick'
执行 bundle install
2. 生成uploader
rails generate uploader UserPic
生成文件uploaders/user_pic_uploader.rb ,修改如下
# 修改文件存储位置 def store_dir # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" "user_head_pic" end # 设置默认头像 def default_url(*args) "/assets/user_head.png" end
# 修改文件名 def filename if original_filename @name ||= Digest::MD5.hexdigest(current_path) "#{@name}#{file.basename}.#{file.extension}" end end
3. 给user表添加用户头像字段
添加migrate文件并执行 rails db:migrate
class AddHeadPicToUsers < ActiveRecord::Migration[5.1] def change add_column :users,:head_pic,:string,:comment=>'头像' end end
4. 修改app/models/user.rb
user.rb中添加UserPicUploader
class User < ActiveRecord::Base mount_uploader :head_pic, UserPicUploader end
5. 保存头像
cotroller中对应的action如下
def update_user_pic image_info = params[:avatar]||"" if image_info.include? "data:image/png" png = Base64.decode64(image_info['data:image/png;base64,'.length .. -1])# 将 Base64 编码的参数用 Base64 解码,得到数据的二进制表示,也就是图片本身的二进制数据 unless Dir.exists?("#{Rails.root}/public/user_head_pic") FileUtils.mkdir_p("#{Rails.root}/public/user_head_pic") end file_name = "img_#{@current_user.user_no}.png"# 根据当前用户工号声明一个文件名 file_path = "#{Rails.root}/public/user_head_pic/#{file_name}" # 确定文件保存路径 File.open(file_path,'wb') do |item|# 根据文件路径创建新文件 item.write(png)# 将前面的二进制数据写到文件里 end @current_user.head_pic = File.open(Rails.root+"public/user_head_pic/#{file_name}") @current_user.save flash[:notice] = "保存成功!" else flash[:notice] = "保存失败!" end redirect_to :action=>:update_head end
6. 显示头像
<img src="<%= @user.head_pic.url%>" />