CGIへの画像の投稿

blogサーバなど、文章だけでなく写真等のファイルを ポストできるものがある。これにはHTMLフォーム input 要素の、type="file" を利用する。

multipart/form-data

文字列や選択オプションを送信するフォームは たとえば以下のように記述した。

<form method="POST" action="./hoge.rb">
 一言メモ: <input name="var" size="40"><br>
 <input type="submit" value="SEND!">
 <input type="reset" value="reset">
</form>

ファイルの中味をPOSTするには、formenctype 属性を 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


目次