バイナリファイルをアップロードする
mrubyをいじり始めてRubyに興味を持ち、最近、Railsをいじり始めました。
Railsも難しくてなかなか勉強も捗りませんが、やったことを自分の防備録として書いておきます。
スマホなどからサーバにバイナリファイルをアップロードしたかったので、その方法を調べてようやくできたので書いておきます。
使用しているバージョンは下記です。
$ ruby --version ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux] $ rails --version Rails 3.2.14
Gemfileの修正
ファイルのアップロードに'Carrierwave'を使うので、gem 'carrierwave'を追記します。後、gem 'therubyracer'のコメントを外します。
gem 'therubyracer', :platforms => :ruby
gem 'carrierwave'
Bundleする
Gemfileの修正が終わったら、bundle installします。
$ bundle install
Java Scriptを有効にする
Java Scriptを有効にするため/config/environments/production.rbを修正します。
config.serve_static_assets = true にします。
# Disable Rails's static asset server (Apache or nginx will already do this) config.serve_static_assets = true
バイナリでアップロードする受け皿を生成する
バイナリでアップロードときに指定するカラムを設定します。
$ rails g uploader runningrecord
runningrecordというカラムを設定しました。これにより、app/uploaders/にrunningrecord_uploader.rbが生成されています。
$ ls -l 合計 2 -rwxrwxrwx. 1 root root 1510 10月 14 12:13 2013 runningrecord_uploader.rb
runningrecord_uploader.rb の中身(コメントは省略)。CarrierWave::Uploader::Baseを継承したRunningrecordUploader クラスができて、保存される場所が書かれています。
# encoding: utf-8 class RunningrecordUploader < CarrierWave::Uploader::Base storage :file def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end end
Controller、View、Modelを自動生成する
scaffoldを用いて、Controller、View、Modelを自動生成します。先に作成した「runningrecord」カラムは必ず必要です。logという名称にしました。
$ rails g scaffold log name:string title:string: datetime:string runningrecord:string temp:string
下記のようなデータベースが生成されることになります。
class CreateLogs < ActiveRecord::Migration def change create_table :logs do |t| t.string :name t.string :title t.string :datetime t.string :runningrecord t.string :temp t.timestamps end end end
データベースを作成する
データベースを生成します。
$ rake db:migrate
モデルにmount_uploaderを追記する
app/models/log.rb に uploaderを追記します。RunningrecordUploader は、runningrecord_uploader.rbのクラス名です。
class Log < ActiveRecord::Base attr_accessible :datetime, :name, :runningrecord, :temp, :title mount_uploader :runningrecord, RunningrecordUploader end
Viewの_form.html.erbを修正する
ファイルをアップロードできるように、app/views/logs/_form.html.erb を修正します。<%= f.text_field :runningrecord %>を、<%= f.file_field :runningrecord %>に変更します。
<div class="field"> <%= f.label :runningrecord %><br /> <%= f.file_field :runningrecord %> </div>
日本語ファイル名を扱えるようにする
CarrierWaveは、そのままでは日本語ファイル名を扱えないので扱えるようにします。config/initializers フォルダに carrierwave.rb というファイルを作成して、下記の1行の内容を書きます。
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
これで日本語ファイル名が扱えるようになります。
rails server
rails serverを起動して確かめます。
$ rails server
http://localhost:3000/logs にアクセスすると下記のような画面が出ました。
New Logをクリックすると入力画面になりました。
アップロードしたファイルをダウンロードする
試しにtest.logファイルをアップロードしました。
ダウンロードするには、runningrecord カラムにそのままのURLが表示されているので、それをhttpプロトコルで指定して呼び出せばOKです。
この場合は、http://localhost:3000/uploads/log/runningrecord/4/test.log を呼べばいいことになります。
以上、Railsでファイルのアップロードとダウンロードを行う方法を防備録として書きました。