読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

RailsのCarrierWaveのカスタマイズ - ファイルの配置先、リサイズ、テストなど

Rails gem ファイルアップロード

前回はCarrierWaveのインストール方法について説明しました。
今回は、ファイルの配置先、リサイズ、テストなどCarrirWaveをもっと使いこなしていくための方法を説明します。

目次

ファイルの配置先

まず、ファイルの配置先としては、大まかには次のどちらにするか選ぶ必要があります。

  1. Railsが動いているサーバーに配置
  2. Amazon S3, Rackspace Cloud Files, Google Strage for Developersなどのクラウド上のストレージに配置

上記の1について説明します。
2については、公式ページを参照してください。

アップロードしたファイルの配置場所を変更するために、store_dirメソッドをオーバーライドしてください。

# app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  ...

  def store_dir
    # デフォルト値
    # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"

    # Rails.root/public/mypath/ 配下にファイルが配置される
    "mypath"
  end

  ...
end

画像サイズの変更(リサイズ)

サムネイル画像など同じファイルの異なったサイズのファイルを表示したい場合があると思います。
画像をリサイズするためにImagemagickMiniMagickのインストールが必要です。

MiniMagickの代わりにRMagickを紹介しているサイトもありますが、MiniMagickは公式に推奨されています。

OSXの場合、BrewコマンドでImageMagickを追加します。

brew install imagemagick

次に、GemfileにMiniMagickを追加します。

# Gemfile
gem "mini_magick"

Bundlerでインストールします。

bundle install

次にMiniMagickをincludeし、また、アップローダーにサイズを変換する指定をいれます。

# app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  ...

  # resize_to_fitはファイルのサイズを変更します
  # アップロードされたファイルを200〜200以下に変換する
  process :resize_to_fit => [200, 200]

  # 別のスケールを設定
  version :thumb do
    process :resize_to_fit => [50, 50]
  end

  ...
end

では、ファイルをアップロードし直してみましょう。
分かりづらいですが、ファイルサイズがリサイズされてサーバーに配置されています。
そのため、画面上で画像のサイズが少し小さくなっています。
f:id:nipe880324:20141022005200p:plain:w480



アップロードファイルの拡張子

PHPやスクリプトファイルなどをサーバー上にアップロードされると危険な場合があります。
そのために、CarrirWaveでは拡張子のホワイトリストを指定し、アップロード可能な拡張子を記載したリストを作成できます。

# app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  ...

  # jpg, jpeg, gif, png のみ許可する
  def extension_white_list
    %w(jpg jpeg gif png)
  end

  ...
end


もし、Modelでアップローダーをマウントしている場合(mount_uploader :image, ImageUploader)、誤った拡張子がアップロードされた場合には、Validationエラーになります。

# app/models/product.rb
class Product < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end

f:id:nipe880324:20141022005304p:plain:w480



アップロードファイルのファイル名

デフォルトでは、CarrierWaveは、アップロードされたファイル名にアルファベット、数字などの簡易な文字しか許可していません。
もし、日本語などをサポートしたい場合は、sanitize_regexpメソッドをオーハーライドし、全ての許可されていない文字列にマッチする正規表現を返す必要があります。

Ruby 2.0以上の場合、Onigumoを使って簡単に記載できます。

CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

Ruby 1.8の場合、手動で特定の文字列にマッチする正規表現を記載する必要があります。

CarrierWave::SanitizedFile.sanitize_regexp = /[^a-zA-Zа-яА-ЯёЁ0-9\.\-\+_]/

i18n

CarrierWAveのi18nファイルを作成しましょう。

# carrierwave.ja.yml
errors:
  messages:
    carrierwave_processing_error: "Cannot resize image."
    carrierwave_integrity_error: "Not an image."
    carrierwave_download_error: "Couldn't download image."
    extension_white_list_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}"
    extension_black_list_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}"

日本語のファイルは次の箇所にあります。
GitHub - carrierwave/locale/ja.yml

参考文献

以上です。
よく分からない箇所がある場合はコメントください。