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 ファイルは残っていた