Ruby1.8.7 ファイルアップロードCGI
CGI を使ったファイルのアップローダを作りたくて、今日初めて Ruby を触っていますが、質問があります。
アップロードするファイル本体以外の情報を name="version" で受け取って、保存するディレクトリを分けるようにしています。書きかけのコードは以下の通りです。(タブによるインデントが入らなかったので、アンダースコアで表現しています)
----------ここからソースコード----------
#!/usr/local/bin/ruby
require "cgi"
begin
__print "Content-Type: text/plain\n\n"
__cgi = CGI.new
__print "Ruby version is "
__print RUBY_VERSION,"\n"
__print "filename = "
__print cgi['upload_file'].original_filename, "\n"
__file = cgi.params['version'][0]
__if file.class == StringIO then
____print "File is StringIO Class.\n"
____print "version = "
____print cgi["version"].string, "\n"
____if File.exist? cgi["version"].string then
______print "このバージョンのディレクトリは既に存在しているため、ディレクトリは作成されませんでした。"
____else
______print "ディレクトリが存在しないので作成します。"
______Dir::mkdir(cgi["version"].string, 0755)
____end
____OUTPUT_DIR = (cgi["version"].string + "/")
____open(OUTPUT_DIR + cgi['upload_file'].original_filename, "w") {|fh|
____fh.binmode
____fh.write cgi['upload_file'].read
____}
__else
____print "File is TempFile Class.\n"
____#ここから先が書きかけで分からない部分です。
__end
rescue => e
__print "Error!" + e
end
----------ここまでソースコード----------
Ruby の CGI モジュールを使っていますが、受け取ったファイルが 10240 バイト未満だと StringIOオブジェクト、10240 バイト以上だと TempFile オブジェクトになるという規則があるそうで、オブジェクトの種類によって分岐させています。
StringIO オブジェクト(10240バイト未満の送信)の場合はこれで想定通りに動いたのですが、TempFile オブジェクトと判別された場合に、 version のテキストフィールドの文字列を print により表示(出力)したりディレクトリ名にしたりする方法が分かりません。また、ファイル本体 upload_file は TempFile オブジェクトの場合でも同じ記述でファイルに保存できますでしょうか?
サーバにインストールされている Ruby のバージョンは 1.8.7 です。