にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

multipart/form-dataのデータを取り出す

画像などのファイルをアップロードできるCGIを作成する場合の書き方。
基本はここのように書けばよい。
常識なのかもしれないが、入力パラメータをファイルと同時にPOSTする場合も、同じ取り出し方をしなければならない、ということに気づかなくてしばらく悩んだ。
つまり、以下のようなフォームで値を取り出す場合(デフォルト)とは異なる、ということ。

デフォルト(application/x-www-form-urlencoded)

<form action="./hoge.rb" method="POST">
	<input type="text" name="param0"/>
	<input type="submit" value="送信"/>
</form>

hoge.rbでの値の取り出し方は、

require 'cgi'
input = CGI.new
param0 = input['param0']

ファイルをアップロードする場合(multipart/form-data)

<form action="./hoge.rb" method="POST" enctype="multipart/form-data">
	<input type="text" name="param0"/>
	<input type="file" name="file0"/>
	<input type="submit" value="送信"/>
</form>

この場合は、

require 'cgi'
input = CGI.new.params
param0 = input['param0'][0].read
file0 = input['file0'][0].read

として、パラメータもファイルデータも取り出す。
そのときのオブジェクトの型は、TmpFileオブジェクト(1024バイト未満の場合はStringIOオブジェクト)となる