Ruby&Rails---carrierwave图片上传功能
2017-10-30 本文已影响0人
HPD_黄霹雳
添加gem 后 bundle
gem 'carrierwave'
创建uploader
会创建app/uploaders/avatar_uploader.rb文件
bin/rails generate uploader Avatar
![](https://img.haomeiwen.com/i5305072/890bef48892f2960.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