ruby基本图片上传
图片上传问题
在我们的项目里,需要实现海报的图片上传,便于更好地向外界展示一个社团活动的基本内容,但是在处理中间件相关问题时遇到了一点小小的挫折。不过这并不要紧,OSS对象存储服务固然好,但是本着交完作业就不去维护的宗旨鉴于我们的用户基数不大,用本地存储这些图片也是可行的。
使用用 CarrierWave 处理图像上传
首先在在 Gemfile 文件中添加 CarrierWave
# For picture upload,you can choose the suitable version by yourself
gem 'carrierwave', '1.2.0'
gem 'mini_magick', '4.7.0'
gem 'fog-aws', '2.0.0'
gem 'nokogiri', '1.10.4'
之后执行命令安装
$ bundle install
CarrierWave 自带了一个 Rails 生成器,用于生成图像上传程序。我们要创建一个名为 picture 的上传程
序:
$ rails generate uploader Picture
下面部分为实战样例
上传的图像应该对应于activities模型中的一个属性,先看看前人遗留数据库中有没有。
可以看到post_horizontal_image_id和post_vertical_image_id两个属性,应该是用ID寻址。
果不其然还有另一个image表,理论上我们只需要修改app/models/image.rb里的方法就可以。
但是之前他们是用图床的。如果改为本地存储这个数据模型不好使。
在activities模型中添加图像上传程序
mount_uploader :picture, PictureUploader
再把picture添加到允许修改的属性列表
def activities_params
params.require(:activities).permit(:picture)
end
到这里基本的图像上传功能已经完成了。具体实现的细节在于mount_uploader指令自动生成的一个叫picture_uploader.rb的文件。
class PictureUploader < CarrierWave::Uploader::Base
storage :file
# 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
# 添加一个白名单,指定允许上传的图像类型
def extension_white_list
%w(jpg jpeg gif png)
end
end
因为本地服务器不堪重负,我们学校200个社团,一个社团假设有2场活动,每场活动2张海报,预计800张照片,还需要添加一个验证图像大小的模块,以节约资源。
def picture_max_size
if picture.size > 2.megabytes
errors.add(:picture, "should be less than 2MB")
end
end
当然,我们还可以在客户端进行各种限制,例如用accept参数限制图像格式。