Gem CarrierWave
Bài đăng này đã không được cập nhật trong 4 năm
Giới thiệu
Là một gem hỗ trợ cho việc upload file trong ứng dụng Rails, nó cung cấp các phương thức đơn giản và linh hoạt giúp người dùng có thể upload file dễ dàng.
Cài đặt
Thêm vào Gemfile:
gem "carrierwave"
chạy bundle install
Giả sử ta có model User có 1 column là Avartar, giờ ta sẽ tạo tính năng upload file đối với cột Avartar này.
rails generate uploader Avatar
Sau khi chạy ta sẽ đc app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
storage :file
end
Bạn cũng có thể dùng uploader class và lưu file hoặc truy xuất file
uploader = AvatarUploader.new
uploader.store!(my_file)
uploader.retrieve_from_store!('my_file.png')
CarrierWave cung cấp cho bạn một store để lưu trữ vĩnh viễn và bộ nhớ cache để lưu trữ tạm thời. Bạn có thể lựa chọn các store khác nhau, bao gồm cả filesystem và cloud storage.
Upload một file
Add column avartar vào model User
rails g migration add_avatar_to_users avatar:string
rails db:migrate
class User < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
end
Giờ bạn có thể lưu file bằng cách gán chúng cho column avartar.
user = User.new
user.avatar = params[:file]
user.save!
user.avatar.url # => '/url/to/file.png'
user.avatar.current_path # => 'path/to/file.png'
user.avatar_identifier # => 'file.png'
Upload nhiều files
Add column avartar vào model User
rails g migration add_avatars_to_users avatars:json
rails db:migrate
class User < ActiveRecord::Base
mount_uploaders :avatars, AvatarUploader
end
Trong form của bạn, thêm multiple: true vào trường input files
<%= form.file_field :avatars, multiple: true %>
Ở users_controller.rb
def create
user = User.new user_params
user.save!
end
private
def user_params
params.require(:user).permit(:email, :first_name, :last_name, {avatars: []})
end
Thay đổi thư mục lưu trữ
Để thay đổi nơi đặt các tệp đã tải lên, chỉ cần ghi đè phương thức store_dir:
class AvatarUploader < CarrierWave::Uploader::Base
def store_dir
'public/my/upload/directory'
end
end
Thay đổi nơi lưu cache
class AvatarUploader < CarrierWave::Uploader::Base
def cache_dir
'/tmp/projectname-cache'
end
end
Ngoài ra còn có 1 số phương thức mở rộng giúp bạn validate file như:
// giới hạn kích thước file
def size_range
1.megabytes..10.megabytes
end
// xác định trước đuôi file
def extension_whitelist
%w(jpg jpeg gif png)
end
// hoặc nội dung file là hình ảnh.
def content_type_whitelist
/image\//
end
Adding versions
Giả sử bạn muốn upload file và kích thước của nó không vượt quá 800 x 800 thì ta có thể thêm 1 version thumb để có thể thu nhỏ hình ảnh 200 x 200. Đầu tiên là cần phải cài đặt Imagemagick
$ brew install imagemagick
class MyUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_fit: [800, 800]
version :thumb do
process resize_to_fill: [200,200]
end
end
// Ta có thể viết như sau:
uploader = AvatarUploader.new
uploader.store!(image) # size: 1024x768
uploader.url # => '/url/to/image.png' # size: 800x600
uploader.thumb.url # => '/url/to/thumb_image.png' # size: 200x200
Có thể lồng version với nhau:
class MyUploader < CarrierWave::Uploader::Base
version :animal do
version :human
version :monkey
version :llama
end
end
Và thêm điều kiện để cho các version
class MyUploader < CarrierWave::Uploader::Base
version :human, if: :is_human?
version :monkey, if: :is_monkey?
version :banner, if: :is_landscape?
private
def is_human? picture
model.can_program?(:ruby)
end
def is_monkey? picture
model.favorite_food == 'banana'
end
def is_landscape? picture
image = MiniMagick::Image.new(picture.path)
image[:width] > image[:height]
end
end
Kết luận
Với gem Carrierwave chúng ta có thể cài đặt và upload file một cách dễ dàng. Trên đây chỉ là hướng dẫn cơ bản để làm quen với gem Carrierwave. Các bạn có thể tham khảo thêm:
How to
https://github.com/carrierwaveuploader/carrierwave
All rights reserved