しゅがーブログ

技術ネタとか書いていけたらな…

Rails carrierwave fog rmagickで画像アップロード

プロダクト開発でアイコンやバックグラウドイメージをアップロードできるようにしたいので試しに使用してみました。
すでに色々な方々が試しているみたいですが、自分なりの備忘として残しておきます。
環境変数はハードコーディングせずにgem:dotenvを使用して実装しています。

carrierwave

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
    region: ENV['AWS_REGION'],
    path_style: true
  }
  config.fog_public = true
  config.fog_attributes = {'Cache-Control' => 'public, max-age=86400'}
  config.remove_previously_stored_files_after_update = false
  config.cache_storage = :fog

  case Rails.env
  when 'production'
    config.fog_directory  = ENV['AWS_S3_BUCKET']
  end
end
# 日本語の文字化けを防ぐ
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

Uploader

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  storage :fog
  def store_dir
    "images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb do
    process resize_to_fit: [100, 100]
  end

  def extension_whitelist
    %w(jpg jpeg png)
  end

  def filename
    "image_#{model.id}.#{file.extension}" if original_filename
  end
end

Model

class User < ApplicationRecord
  mount_uploader :icon, ImageUploader
end

参考

Rails4.2+carrierwave+fog+rmagickでS3に画像アップロードした話 - Qiita
CarrierWave + Rails 5.1で画像アップローダー | 酒と涙とRubyとRailsと
GitHub - carrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks