blogサーバなど、文章だけでなく写真等のファイルを
ポストできるものがある。これにはHTMLフォーム input
要素の、type="file"
を利用する。
文字列や選択オプションを送信するフォームは たとえば以下のように記述した。
<form method="POST" action="./hoge.rb"> 一言メモ: <input name="var" size="40"><br> <input type="submit" value="SEND!"> <input type="reset" value="reset"> </form>
ファイルの中味をPOSTするには、form
の enctype
属性を multipart/form-data
に変える。
<form method="POST" enctype="multipart/form-data" action="./hoge.rb"> 一言メモ: <input name="var" size="40"><br><br> 画像を選んでね: <input name="image" type="file"> <input type="submit" value="SEND!"> <input type="reset" value="reset"> </form>
HTMLで multipart/form-data を指定して入力させた値を受け取るCGIスクリプト、 すなわちRubyプログラムは、CGI変数の受け取りを以下のように変更する。
require "cgi"
cgi = CGI.new("html4")
memo = cgi["var"].read # CGI変数 var の受け取り
photo_filename = cgi["image"].original_filename # ファイル名の受け取り
photo_size = cgi["image"].size # 送信ファイルサイズ取得
photo_data = cgi["image"].read # 送信ファイルデータの受け取り
このように、実際のCGIフォームでの送信値を得るには read
メソッドを介して行なう。
読み取った画像データをファイルに保存するにはたとえば以下のようにする。
open("ファイル名", "w") do |out| out.write cgi["image"].read end
保存するファイル名は上書きに留意しつつ適切に決める。 なお、ファイルを保存するディレクトリはWebサーバの権限で書き込めるよう にしておく。そのため、画像データを書き出すディレクトリは あらかじめ決めて chmod 1777 しておくとよい。
1MB以下の画像ファイル(JPEGまたはPNG)を投稿してみよ。
ソース: filepost.rb