12/08/2018, 15:40

Send images in api with carrierwave-base64

Carrierwave đã không còn xa lạ gì đối với các lập trình viên RoR, nó hổ trợ upload file một cách dễ dàng hơn giữa client(browser) và server. Hôm này mình xin hướng dẫn cách upload image khi dùng API với gem carierwave-base64 Ví dụ: Mình cần update image cho thuộc tính Avatar của đối tượng User ...

Carrierwave đã không còn xa lạ gì đối với các lập trình viên RoR, nó hổ trợ upload file một cách dễ dàng hơn giữa client(browser) và server. Hôm này mình xin hướng dẫn cách upload image khi dùng API với gem carierwave-base64 Ví dụ: Mình cần update image cho thuộc tính Avatar của đối tượng User 1.Cài đặt Trong file Gemfile cần thêm vào

    gem "carrierwave-base64"

Sau đó chạy bundle install để cài đặt và restart lại server 2.Thêm uploader Nếu trong model User đả có sử dụng uploader khi dùng gem carrierwave thì chúng ta có thể dùng chung uploader này còn nếu chưa có thì dùng lệnh sau để tạo ra nó

    rails generate uploader Avatar

sau đó thêm vào model User như sau

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

3. Tùy chọn nâng cao cho uploader

class AvatarUploader < CarrierWave::Uploader::Base
    #Thay đổi nơi lưu trữ
  def store_dir
    'public/my/upload/directory'
  end
  
  #Giới hạn các định dạng file cho phép
  def extension_white_list
    %w(jpg jpeg gif png)
  end
  
  #Giới hạn kích thước hình ảnh(sử dụng thêm gem MiniMagick)
  include CarrierWave::MiniMagick

  process resize_to_fit: [800, 800]
  
  #Thêm versions cho thuộc tính avatar (thêm gem Imagemagick và MiniMagick)
  version :mini do
    process resize_to_fill: [200,200]
  end
  #Để lấy version mặc định là dùng User.avatar.url và lấy version mini ta dùng User.avatar.mini.url. Tương tự như vậy ta có thể tạo nhiều version với các kích thước khác nhau
end

4.Sử dụng Rất đơn giản, bây giờ trong json từ clinet gửi lên, image chỉ cần convert thành dạng mã base64 và gắn kèm vào thuộc tính avatar trong json là xong vậy là xong. Ví dụ mình có đoạn json tạo mới User như sau

{
  "User":
  {
    "name": "Nguyen Van A",
    "email": "abc@gmail.com",
    "'password": "123456",
    "avatar": "data:image/png;base64,(<base64 encoded data>)"
  }
}

thay mã base64 sau khi convert của image vào <base64 encoded data> thế là xong

Bài viết không thể tránh khỏi thiếu sót mình rất mong nhận được sự góp ý và phản hồi của các bạn.

Tài liêu tham khảo: https://github.com/carrierwaveuploader/carrierwave

0