コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

バイナリファイルをアップロードする

mrubyをいじり始めてRubyに興味を持ち、最近、Railsをいじり始めました。
Railsも難しくてなかなか勉強も捗りませんが、やったことを自分の防備録として書いておきます。
スマホなどからサーバにバイナリファイルをアップロードしたかったので、その方法を調べてようやくできたので書いておきます。
使用しているバージョンは下記です。

$ ruby --version
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]

$ rails --version
Rails 3.2.14

Railsアプリケーションを作る

今回はchotplusというアプリケーションを作成します。生成されたらフォルダに入ります。

$ rails new chotplus
$ cd chotplus

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 1014 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でファイルのアップロードとダウンロードを行う方法を防備録として書きました。