Railsで複数ファイルをアップロードする
HTML5 で実装された『multiple』機能を使って複数選択したファイルを一括アップロードする仕組みを考えてみた。
まずView側だ。
< %= form_tag( {:action => ”cat”}, {:multipart => true} ) do %> ファイル選択 < %= file_field_tag ”uploads[]”, :multiple => true %> < %= submit_tag ”アップロード” %> < % end %>
こんな感じにする。『:multiple => true』だけで複数ファイルに対応してくれる。uploads[]と、配列で受け取るようにするのがポイントだ。
controller側も作る。
アップロードされたファイルを結合してダウンロードする、というものを作ってみた。
def cat outFile = ”” fileName = ((’a’..’z’).to_a + (’A’..’Z’).to_a + (’0’..’9’).to_a).shuffle[0..23].join tmpFile = File.join(Rails.root, ”tmp”, fileName) params[:uploads].each do |file| outFile = file.original_filename if outFile == ”” File.open(tmpFile, ”a”) { |f| f.write(file.read) } end File.open(tmpFile, ”r”) { |f| send_data(f.read, type => ’text/csv’, :filename => outFile + ’.csv’) } File.delete(tmpFile) if File.exist?(tmpFile) end
ランダムに生成した名前で tmp ディレクトリに作業ファイルを作り、アップロードしたファイルを順次追加書き込みしていく。
作業ファイルをメモリに読み込んでからダウンロードする。
作業ファイルを削除する。
といった手順だ。
プログラムは冗長できたないが、要は『params[:uploads].each』で個々のファイルが取得できるということ。
とても良いのだが、この仕組みには欠点もある。
それは、IE8、IE9がHTML5に対応出来ていないということ。Firefoxではちゃんと動く。たぶん、IE10は大丈夫だと思う。
クライアントを選ぶが、複数ファイルアップロードに簡単に対応出来る方法ではある。
PENTAX Q + 02レンズ。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/929
この投稿には、まだコメントが付いていません
コメント
_CM_NOTICE