rails中使用CarrierWave实现文件上传的功能

时间:2023-08-08 21:26:56

之前在用django写blog的时候头像上传和头像预览都是使用原生的js实现的,之前也有写了一篇blog。好了开始进入正题

rails中实现头像上传十分的方便,只要通过CarrierWave这个gem来实现就可以了。rails只能说他的gem都非常的好用,实现功能特别的快速。

我们先在Gemfile中引入这个gem

gem 'carrierwave'

然后执行bundle安装这个carrierwave。接下来在终端执行命令,创建头像的uploader(如果你上传的是其他的文件那么可以生成其他的uploader)

rails g uploader avatar

此命令会生成app/uploaders/avatar_uploader.rb文件。这个文件就是针对用户头像上传的配置文件,文件默认的配置如下:

class AvatarUploader < CarrierWave::Uploader::Base
storage :file def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
  • storage: 方法配置了文件存储方式,默认是存储到文件。
  • __store_dir__: 方法是定义文件的存储目录。

保持默认的配置,继续往下走。接下来需要添加用户头像的存储字段:

rails g migration add_avatar_to_users avatar:string
rails db:migrate

然后到用户模型中,绑定用户头像字段和属于它的 uploader

class User < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
end

最后在视图表单中添加头像上传的文件选择框:

<%= f.label :avatar %>
<%= f.file_field :avatar %>

大功告成。现在就可以测试一下用户头像的上传功能了。如果上传成功,会在 public 目录中出现 uploads/user/avatar 目录。里面有以用户 id 命名的文件夹,文件夹中保存了上传成功的文件。而用户头像字段 avatar 则保存了文件名。使用 user.avatar 就可以获取用户的头像地址。

rails中使用CarrierWave实现文件上传的功能

CarrierWave 还有着更多可配置的特性。例如文件安全上传,文件上传时进行缩放和水印处理,云端存储等。每个特性都足以写一篇文章了,所以这里就此打住。我想留作日后实际使用过后再分享。可以前往它的 Github 项目页面去了解,地址是: https://github.com/carrierwaveuploader/carrierwave