Ruby on Rails2.1-ファイルのアップロード

サイトの訪問者にサーバーにファイルをアップロードしてもらいたいという要件がある場合があります。Railsを使用すると、この要件を非常に簡単に処理できます。次に、単純で小さなRailsプロジェクトを進めます。

いつものように、という新しいRailsアプリケーションから始めましょう。 upload。簡単な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

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

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 ルビーオブジェクトであり、 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」モデルに渡します。アップロードディレクトリを、前に作成した「uploads」ディレクトリ「directory = 'data'」に設定します。

class UploadController < ApplicationController
   def index
      render :file => 'app\views\upload\uploadfile.html.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に設定することにより、アクションがファイルからのバイナリデータを適切に渡すようにします。

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

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

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

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

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

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 Reference Manual