徒然なるままに、日ぐらしP/Cに向ひて――
メインメニュー
ブログカレンダー
2013年 7月
« 6月   8月 »
 123456
78910111213
14151617181920
21222324252627
28293031  
WordPress カテゴリ一覧
WordPress 検索


富士カメラ5

Kestrel とは、チョウゲンボウのことです。ハトくらいの小さな猛禽類、つまりワシの仲間で、ハヤブサに似ています。
チョウゲンボウにはホバリングという特技があります。よく農地の上空で空中に停止している姿が見られます。小さいけれどカッコイイ、そして最近は都会でも繁殖している頼もしいタカです。
このサイトのURLは、そんなチョウゲンボウから名前を借りました。

2013年7月27日(土曜日)

Railsで複数ファイルをアップロードする

カテゴリー: - flyman @ 22時19分32秒

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

このコメントのRSS

TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/929

この投稿には、まだコメントが付いていません

コメント

_CM_NOTICE

20 queries. 0.014 sec.
Powered by WordPress Module based on WordPress ME & WordPress

ヘッドライン
nikkansports
IT Pro
レスポンス
テーマ選択

(4 テーマ)