WEBrickでアップロードされたファイルを保存する
思いつきでRubyをすこしつまみ食いしてみました。Ruby初体験です。
Ruby+WEBrickをチョコチョコといじる過程でアップロードされたファイルを保存するサーブレットを作ってみました。意外と用途はありそうなんですがサンプルがぜんぜん見つからなかったので同じようなことやりたい人向けに公開しておきます。(探し方が悪い可能性は否めませんが…)
ただRuby歴1日の人が書いたコードなので「お作法」に従ってない可能性がありますが、その点ご了承ください。むしろ指摘していただければ助かります。f(^^;)
uploader.rb
require 'webrick' class Uploader < WEBrick::HTTPServlet::AbstractServlet def do_POST(request, response) print 'HTTP Method: POST', "\n" print 'HTTP Content-Type: ', request.query['uploadedFile']['content-type'], "\n" print 'File name: ', request.query['uploadedFile'].filename, "\n" print 'Data size: ', request.query['uploadedFile'].to_s.size, "\n" filename = request.query['uploadedFile'].filename uploadedFile = File.open(filename, "wb") uploadedFile.write request.query['uploadedFile'].to_s uploadedFile.close end def do_GET(request, response) print 'HTTP Method: GET', "\n" end end
上記のrbファイルをサーブレットとしてHTTPサーバにマッピングしたら受け側は準備完了です。下記コードでは /upload をマッピング先としました。またアップロードされたファイルは元のファイル名でカレントディレクトリに保存されます。(本当はドキュメントルートのパスをHTTPServerのインスタンスから取得してそこに配置するようにしたかったのですが、やり方がわかりませんでした。)
httpserver.rb
require 'webrick' include WEBrick server = HTTPServer.new( :Port => 8000, :DocumentRoot => File.join(Dir::pwd, "public_html") ) trap("INT"){ server.shutdown } require 'uploader' server.mount('/upload', Uploader) server.start
あとは以下のような形でformタグを書いてアップロードするフォームを用意したHTMLファイルをpublic_htmlにでも入れておけばそこからアップロードできるようになります。
<form method="POST" action="/upload" enctype="multipart/form-data"> <div> アップロードするファイル: <input type="file" name="uploadedFile" size="100"/> </div> <input type="submit" value="アップロード"/> <input type="reset" value="取消"/> </form>