Hatena::ブログ(Diary)

daigotoの備忘録 RSSフィード

2010-01-19

rack上でのファイルアップロード

書いておかないと確実に忘れる自信があるので、書き留めておく。

rackの内部実装でmultipartなリクエストで type='file'の場合、データは以下のサブハッシュ形式で保持している。

  data = {:filename => filename, :type => content_type,:name => name, 
          :tempfile => body, :head => head}

これをSinatraで書くとなると、

  if params[:name]
    File.open(params[:name][:filename], 'wb'){ |f| 
       f.write(params[:name][:tempfile].read) 
    }
  end

このときrack内部では、:tempfileの一時保存先にtempfileを使用しており、つまり Dir.tmpdir が使われる。なので一時ファイルの保存場所を特定の場所に決めておきたいなら、ENV['TMPDIR'] = '/tmp/hoge' など環境変数を指定しておくこと。ちなみにこの設定はアプリケーション全体に影響するので、ほかで Dir.tmpdir を使用しているところがある場合は要注意。

 

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。