Ruby-on-rails-2.1-rails-file-uploading

提供:Dev Guides
移動先:案内検索

Ruby on Rails 2.1-ファイルのアップロード

サイト訪問者がサーバーにファイルをアップロードする必要がある場合があります。 Railsでは、この要件を非常に簡単に処理できます。 次に、シンプルで小さなRailsプロジェクトを進めます。

いつものように、 upload と呼ばれる新しいRailsアプリケーションから始めましょう。 簡単なrailsコマンドを使用して、アプリケーションの基本構造を作成しましょう。

C:\ruby> rails -d mysql upload

アップロードしたファイルを保存する場所を決めましょう。 これがパブリックセクション内の data ディレクトリであると想定します。 したがって、このディレクトリを作成し、権限を確認してください。

C:\ruby> cd upload
C:\ruby\upload> mkdir upload\public\data

次のステップは、コントローラーとモデルを作成するための通常の手順です。

モデルの作成

これはデータベースベースのアプリケーションではないため、使いやすい名前であれば何でも使用できます。 DataFile モデルを作成する必要があるとします。

C:\ruby\upload> ruby script/generate model DataFile
   exists  app/models/
   exists  test/unit/
   exists  test/fixtures/
   create  app/models/data_file.rb
   create  test/unit/data_file_test.rb
   create  test/fixtures/data_files.yml
   create  db/migrate
   create  db/migrate/001_create_data_files.rb

ここで、 data_file.rb モデルファイルに save というメソッドを作成します。 このメソッドは、アプリケーションコントローラーによって呼び出されます。

class DataFile < ActiveRecord::Base
   def self.save(upload)
      name = upload['datafile'].original_filename
      directory = "public/data"
      # create the file path
      path = File.join(directory, name)
      # write the file
      File.open(path, "wb") { |f| f.write(upload['datafile'].read) }
   end
end

上記の関数はCGIオブジェクト upload を受け取り、ヘルパー関数 original_filename を使用してアップロードされたファイル名を抽出し、最後にアップロードされたファイルを「public/data」ディレクトリに保存します。 ヘルパー関数 content_type を呼び出して、アップロードされたファイルのメディアタイプを知ることができます。

ここで、 File はrubyオブジェクトであり、 join はディレクトリ名とファイル名を連結し、完全なファイルパスを返すヘルパー関数です。

次に、ファイルを書き込みモードで開くために、 File オブジェクトによって提供されるオープンヘルパー関数を使用しています。 さらに、渡されたデータファイルからデータを読み取り、出力ファイルに書き込みます。

コントローラーの作成

さて、アップロードプロジェクト用のコントローラーを作成しましょう-

C:\ruby\upload> ruby script/generate controller Upload
   exists  app/controllers/
   exists  app/helpers/
   create  app/views/upload
   exists  test/functional/
   create  app/controllers/upload_controller.rb
   create  test/functional/upload_controller_test.rb
   create  app/helpers/upload_helper.rb

次に、2つのコントローラー関数を作成します。 最初の関数 index はビューファイルを呼び出してユーザー入力を取得し、2番目の関数 uploadFile はユーザーからファイル情報を取得して 'DataFile’モデルに渡します。 アップロードディレクトリを、先ほど作成した「ディレクトリ= 'データ'」の「アップロード」ディレクトリに設定します。

class UploadController < ApplicationController
   def index
      render :file => 'app\views\upload\uploadfilel.erb'
   end
   def uploadFile
      post = DataFile.save( params[:upload])
      render :text => "File has been uploaded successfully"
   end
end

ここでは、モデルファイルで定義されている関数を呼び出しています。 render 関数は、ファイルの表示とメッセージの表示にリダイレクトするために使用されています。

ビューを作成する

最後に、コントローラーで言及したビューファイル uploadfile.rhtml を作成します。 このファイルに次のコードを入力します-

<h1>File Upload</h1>

<% form_tag ({:action => 'uploadFile'},
   :multipart => true) do %>

<p><label for="upload_file">Select File</label> :

<%= file_field 'upload', 'datafile' %></p>

<%= submit_tag "Upload" %>

<% end %>

ここで、すべては前の章で説明したものと同じです。 唯一の新しいタグは file_field で、ユーザーのコンピューターからファイルを選択するためのボタンを作成します。

multipartパラメーターをtrueに設定することにより、アクションがファイルのバイナリデータを適切に渡すようにします。

ここで注意すべき重要な点は、:upload *ボタンをクリックすると呼び出される:action のメソッド名として *"uploadFile" を割り当てたことです。

次のように画面が表示されます-

ファイルのアップロード

次に、ファイルを選択してアップロードします。 このファイルは、実際のファイル名でapp/public/dataディレクトリにアップロードされ、「ファイルが正常にアップロードされました」というメッセージが表示されます。

-出力ディレクトリに同じ名前のファイルが既に存在する場合、上書きされます。

Internet Explorerからアップロードされたファイル

Internet Explorerは、送信されたファイル名にファイルの完全なパスを含めるため、 original_filename ルーチンは次のようなものを返します-

C:\Documents and Files\user_name\Pictures\My File.jpg

ただの代わりに-

My File.jpg

これは、 File.basename によって簡単に処理され、ファイル名の前のすべてが削除されます。

def sanitize_filename(file_name)
   # get only the filename, not the whole path (from IE)
   just_filename = File.basename(file_name)
   # replace all none alphanumeric, underscore or perioids
   # with underscore
   just_filename.sub(/[^\w\.\-]/,'_')
end

既存のファイルを削除する

既存のファイルを削除する場合は、非常に簡単です。 あなたがする必要があるのは、次のコードを書くことです-

def cleanup
   File.delete("#{RAILS_ROOT}/dirname/#{@filename}")
   if File.exist?("#{RAILS_ROOT}/dirname/#{@filename}")
end
*File* オブジェクトの詳細については、* Rubyリファレンスマニュアル*をご覧ください。