最近项目中需要实现头像上传功能的API接口,并且可以设置默认头像,这篇文章来大概总结一下具体的实现过程。
Rails中 实现图片上传最常用的是使用“gem carrierwave”。
github 地址: carrierwave
Step1
安装gem "carrierwave"
gem "mini_magick"
Step2
1 | rails g image uploader |
这个命令会生成image_uploader.rb
这个文件。之后关于图片的设置都需要在这个文件里设置。下面是我设置的配置文件。
1 | class ImageUploader < CarrierWave::Uploader::Base |
Step3
设置model。table中的哪个字段存储图片就需要设置这个字段。1
2
3
4class TblPlayerinfo < ApplicationRecord
# headimg 为存储用户头像的字段
mount_upload :headimg, ImageUploader
end
Step4
显示上传图片的url地址,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19if @player.present?
@gamer = @player.first
json.code 0
json.msg "已找到该玩家"
json.playerMsg do
json.uid @gamer.userid
json.name @gamer.nickname
json.gold @gamer.gold
json.online true
json.sex @gamer.sex
json.viptype @gamer.account.vip_type
json.headimgurl @gamer.headimg_url
json.score @gamer.score
json.diamond @gamer.diamond
end
else
json.code 1
json.msg "玩家不存在"
end
其中可以使用字段名加url后缀来直接显示图片的url地址。如headimg_url
总结:昨天一直想实现默认头像的功能,起初是在headimg这个字段设置默认值,但是捞出来的url总是错误的。后来仔细看了carrierwave的说明文档,才搞懂该如何设置默认的文件地址。教训:遇到问题要第一时间看官方文档和源代码,相比于在网络上寻找教程不仅可以提高自己的解决问题的效率,而且还能让自己养成看原始文档的好习惯。
补充:1
2
3
4class TblPlayerinfo < ApplicationRecord
# headimg 为存储用户头像的字段
mount_upload :headimg, ImageUploader
end
其中headimg字段在数据库中的数据被记录为图片的名称。如果想要直接从数据库中直接获取完整的图片url地址,可以添加一个字段headimg2
用来代替headimg,然后headimg的值可以设置为服务器地址+headimg2, 例如1
2
3
4
5
6
7
8
9
10
11
12
13if @player.update(:headimgxf => params[:image])
@player.update( :headimg => "47.100.60.84" + @player.headimgxf.to_s )
json.code 0
json.msg "上传成功"
json.playerMsg do
json.uid @player.userid
json.name @player.nickname
json.headimgurl @player.headimg
end
else
json.code 1
json.msg "上传失败"
end
这样从数据库中捞取headimg字段的数据时就是完整的url地址了。