ruby on rails

Ruby&Rails---carrierwave图片上传功能

2017-10-30  本文已影响0人  HPD_黄霹雳

添加gem 后 bundle

gem  'carrierwave'

创建uploader

会创建app/uploaders/avatar_uploader.rb文件

bin/rails generate uploader Avatar
图片.png

avatar_aploader的内容如下:

class AvatarUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  # 存储的类型是文件
  storage :file
  # storage :fog

  # 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/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process scale: [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process resize_to_fit: [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  # 图片格式接受白名单
  # def extension_whitelist
  #   %w(jpg jpeg gif png)
  # end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end

end

默认的图片放置位置是在public/uploads/下,如果要修改这个路径,需要指定上述的 store_dir

挂载到对应的model上,这边用的是一个avatar字段

class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader
end

到这边配置已经完成了。
下面是我这边写的一个app通过接口上传头像,然后后台返回该图片的网址,用的是本地服务器。

APP上传头像到后台接口

 对应的路由  post 'user/upload_avatar'
  # 上传头像
  def upload_avatar
    avatar = params[:avatar]
    user = User.find(params[:id])
    # !!! 这句在数据中存储的是文件名:例如:20171026_204107_crop.jpg
    user.avatar = avatar
    if user.save
      render json: {code: 1, usericon: generate_user_avatar_url(user.id), message: "头像上传成功"}
      return
    end
    render json: {code: 2, message: "头像上传失败"}
  end
  def generate_user_avatar_url(user_id)
    return "http://#{request.host_with_port}/user/avatar/#{user_id}"
  end

获取头像接口

 对应的路由  get 'user/avatar/:id'

 # 返回用户头像
  def avatar
    id = params[:id]
    user = User.where(id: id).last
    if user==nil
      #默认图
      path = "#{Rails.root}/public/uploads/user/avatar/default_user_icon.png"
    else
      # user.avatar = /uploads/user/avatar/46/da_1509356355185_crop.jpeg
      path = "#{Rails.root}/public#{user.avatar}"
    end
    data = File.read(path)
    send_data(data, type: "image", disposition: "inline")
  end
上一篇 下一篇

猜你喜欢

热点阅读