こんにちは。beaglesoftの真鍋です。
前回はcarrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworksを利用してファイルのアップロードが行えることを確認しました。とりあえずファイルのアップロードができるところまでは進みましたが、今回はファイルの保存先や設定などを確認したいと思います。
ファイルの保存先
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
これにより以下のとおりファイルが保存されます。
アップロード可能なファイルの制限
アップロード可能なファイルはホワイトリストに拡張子を設定することで制限することができます。今回は画像ファイルのみアップロード可能と設定します。
# 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のブックをアップロードしようとしたところエラーとなることが確認できました。
ソースコード
ソースコードはGithubにあります。参考に利用してください。
beaglesoftjp/CarrierWaveExample: CarrierWaveを利用したファイルのアップロードを行うサンプルです。
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログ (8件) を見る
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/26
- メディア: 単行本
- この商品を含むブログ (1件) を見る