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%>" />

 

posted @ 2018-01-05 16:43  小芬喵  阅读(204)  评论(0编辑  收藏  举报