Sinatraでファイルをアップロードさせる方法

このまえ Sinatra でファイルをダウンロードさせる方法を書いた。では逆、アップロードはどうだろう?試したところ、次のようになった。

require 'rubygems'
require 'sinatra'
require 'haml'

get '/' do
    haml :index
end

# アップロードされたファイルを返す
put '/upload' do
  if params[:file]
    content_type params[:file][:type]
    f = params[:file][:tempfile]
    f.read f.size
  end
end
__END__
@@index
%html
  %body
    %form{:action => '/upload', :method => 'POST', :enctype => 'multipart/form-data'}
      %input{:type => 'file',   :name => 'file'}
      %input{:type => 'submit', :value => 'upload'}
      %input{:type => 'hidden', :name => '_method', :value => 'put'}
  • アップロードされたファイルの情報は params[:file] に収められている。
  • put を使いたい場合は、name="_method", value="put" の input 要素をフォームに埋め込んでおく。
  • アップロードされたファイルは temp ファイルになる。temp ファイルが消されるタイミングはサーバがシャットダウンするときなので、消し忘れに注意*1

*1:サーバは Thin 1.2.7 で試した。shotgun を使った場合は、サーバをシャットダウンさせた後でも temp ファイルは残っていた