2008年12月23日火曜日

WEBrick::HTTPServlet::AbstractServletでサーブレットを作ってみました。

こんにちは。モリモルです。
2008年もあと1週間ほど。1年が早く感じます。

前回使ったHTTPFileHandlerが継承している、AbstractServletで簡単なサーブレットを作ってみようと思います。
※実行環境は1.8ですが、今後は参照するリファレンスはRuby1.9にしました(見やすいので。。)



まず、頭の中を整理。。



さて、今回作成するサーブレットにはPOSTメソッドのみ実装します。
(実装されていないHTTPメソッドが送られてくると例外を発生するようです)
サーブレットに送られるHTTPリクエストのBodyには、JPEGファイルが1つだけ添付されます。
サーブレットは、リクエストBodyからJPEGデータを抽出し、HTTPレスポンスのBodyに付けて返します。

まとめると、「フォームからPOSTで画像ファイルを送ると、サーブレットがその画像を返す」という単純なものです。



index.html(フォームページ)

<html>
<body>
<form action="/my_servlet" method="post" enctype="multipart/form-data">
<input type="file" name="img1">
<input type="submit">
</form>
</body>
</html>



server.rb(サーバー用スクリプト)

1 #!/usr/local/bin/ruby
2
3 require 'webrick'
4 include WEBrick
5
6 class MyServlet < HTTPServlet::AbstractServlet
7
8 def do_POST(req, res)
9 p req.query["img1"]
10 res.content_type = "image/jpeg"
11 res.body = req.query["img1"]
12 end

13
14 end
15
16 server = HTTPServer.new(
17 :DocumentRoot => "/var2/www/html",
18 :Port => 20080,
19 :BindAddress => "192.168.207.128")
20
21 server.mount("/my_servlet", MyServlet)
22
23 trap("INT"){server.stop}
24
25 server.start



9行目:HTTPリクエストBodyから画像を抽出して標準出力してます。やる意味はありませんが試しにいれました。
10行目:HTTPレスポンスヘッダのContent-Typeを指定。
11行目:HTTPレスポンスのBodyに画像データを代入。

では、ブラウザから"/my_servlet"へJPEGファイルをPOSTしてみます。





画像が表示されました。

9行目の標準出力の結果です。
文字列に変換するとつぎのようになります。
10行目のContent-Typeを適切に指定しないと、ブラウザ側はJPEGとして認識してくれません。

このデータをFile.open("foo.jpg", "w"){|file| file.write(req.query["img1"])}とかでサーバーに保存できるようです。