技術系ブログ

とにかく小ネタで

【rails】画像アップロード(shrine)導入からherokuでの本番環境利用(S3)まで パート2

次に画像のリサイズとバリテーションをします。
参考:Shrineでアップロードする際に画像を加工する | RE:ENGINES
参考:image_processing/minimagick.md at master · janko/image_processing · GitHub

画像のリサイズ

ImageMagickのインストール

ImageMagickとは、ImageMagick - Convert, Edit, or Compose Bitmap Images brew install imagemagick

gemを追加

gem 'image_processing'
gem 'mini_magick'

サイズを指定

パート1【rails】画像アップロード(shrine)導入からherokuでの本番環境利用(S3)まで パート1 - 技術系ブログ で作った、image_uploader.rbに記述します。

require "image_processing/mini_magick"

class ImageUploader < Shrine
  plugin :processing 
# プロセスプラグインを使用すると、指定したアクションのファイル処理を宣言的に定義して、変換することができます
  plugin :versions  
 # バージョンプラグインを使用すると、処理時にファイルのハッシュを返すことができるため、アップローダーはバージョンを処理できます。
  plugin :delete_raw
 # delete_rawプラグインは、アップロードされた生ファイルを自動的に削除します。これは、アップロード後に一時ファイルが確実に削除されるようにするために、処理を行うときに特に役立ちます。

  process(:store) do |io, context|
    versions = { original: io } 

    io.download do |original|
      pipeline = ImageProcessing::MiniMagick.source(original)

      versions[:large]  = pipeline.resize_to_limit!(800, 800)
      versions[:medium] = pipeline.resize_to_limit!(500, 500)
      versions[:small]  = pipeline.resize_to_limit!(300, 300)
    end

    versions 
  end
end

show側

= iamge_tag @post.iamge[large].url
#versions[:large]

バリテーション

image_uploader.rbに追記

image_uploader.rbに追記していきます 参考:File Validation · Shrine

require "image_processing/mini_magick"

class ImageUploader < Shrine
  plugin :processing 
  plugin :versions  
  plugin :delete_raw
  plugin :validation_helpers  # ←これと

  process(:store) do |io, context|
    versions = { original: io } 

    io.download do |original|
      pipeline = ImageProcessing::MiniMagick.source(original)

      versions[:large]  = pipeline.resize_to_limit!(800, 800)
      versions[:medium] = pipeline.resize_to_limit!(500, 500)
      versions[:small]  = pipeline.resize_to_limit!(300, 300)
    end

    versions 
  end
#↓これを追記
  Attacher.validate do
    validate_max_size 5 * 1024 * 1024, message: '5MBを超える画像はアップロードできません。'
    validate_mime_type_inclusion %w(image/jpeg image/png)
  end
end

これで完了