CarrierWaveを利用した画像ファイルのアップロード(2)

こんにちは。beaglesoftの真鍋です。

前回はcarrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworksを利用してファイルのアップロードが行えることを確認しました。とりあえずファイルのアップロードができるところまでは進みましたが、今回はファイルの保存先や設定などを確認したいと思います。

blog.beaglesoft.net

ファイルの保存先

CarrierWaveは簡単にファイルをアップロードできますが、ファイルの保存先情報などは以下のとおり確認できます。

>> ps = PictureStore.first
D, [2016-03-31T05:50:20.162983 #68278] DEBUG -- :   PictureStore Load (0.1ms)  SELECT  "picture_stores".* FROM "picture_stores"  ORDER BY "picture_stores"."id" ASC LIMIT 1
#<PictureStore id: 1, store_name: "aaaaa", picture: "me.jpg", created_at: "2016-03-30 12:13:17", updated_at: "2016-03-30 12:13:17">

# urlで公開されているURLが取得できる
>> ps.picture.url
"/uploads/picture_store/picture/1/me.jpg"

# current_pathで保存先の絶対パスを取得できる
>> ps.picture.current_path
"/Users/ymanabe/projects/carrier_wave/public/uploads/picture_store/picture/1/me.jpg"

# ファイルのフィールド名_identifierでファイル名を取得できる
>> ps.picture_identifier 
"me.jpg"

まず基本的なこととして、ファイルに関する情報は対応するフィールドを指定したモデルから取得することができます。これは下記のように mount_uploaderを定義することでさまざまな処理をincludeしているためです。

class PictureStore < ActiveRecord::Base
  mount_uploader :picture, PictureUploader
end

ファイルの保存先を変更する

ファイルの保存先を変更する場合には、前回作成したPictureUploaderを修正します。今回はアプリケーション内のpublicディレクトリでuploadsディレクトリからtmpディレクトリに変更しました。

# encoding: utf-8

class PictureUploader < CarrierWave::Uploader::Base
   ...
  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
   # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    "tmp/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
   ...
end

これにより以下のとおりファイルが保存されます。

スクリーンショット 2016-03-31 06.12.29.png (13.1 kB)

アップロード可能なファイルの制限

アップロード可能なファイルはホワイトリストに拡張子を設定することで制限することができます。今回は画像ファイルのみアップロード可能と設定します。

# encoding: utf-8

class PictureUploader < CarrierWave::Uploader::Base

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog
    ....

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end

...
end

Excelのブックをアップロードしようとしたところエラーとなることが確認できました。

carrier_wave_demo2.gif (228.4 kB)

ソースコード

ソースコードはGithubにあります。参考に利用してください。

beaglesoftjp/CarrierWaveExample: CarrierWaveを利用したファイルのアップロードを行うサンプルです。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

たのしいRuby 第5版

たのしいRuby 第5版