From: "堀川 久" Date: 2003-07-23T22:03:09+09:00 Subject: [ruby-list:37962] Re: multipart/form-dataのためのcgi.rbの修正 こんにちは。 最初にヘタレなパッチを投げてしまってすいません。 Yukihiro Matsumoto wrote in <1058954906.210653.12608.nullmailer@picachu.netlab.jp> >|> あ、それとも[]の定義の方はそのままで、CGI::Value#initialize >|> の方でvalueが文字列で無かったらreadで文字列化する方が使いや >|> すいでしょうか。 >| >|String以外を気にしなくて済む分、使いやすいかも知れませんね。こ >|のへんはcgi.rbをよく使う人に聞いてみないと。 > >というわけでご意見募集。明日昼ごろまでに反応がゼロならば、 > > nil -> "" -> wrap CGIをよく使う人です(CGIばかりともいう)。単に nil -> "" では不味いで す。 ●application/x-www-form-urlencoded の場合、 [コントロール名] -> 文字列 [その他] -> "" 想定される使い方は、 if cgi["foo"] != "" s = cgi["foo"] ... ●multipart/form-data の場合、 [コントロール名] -> StringIO or Tempfile [その他] -> ??? その他が "" だと、 if defined?(cgi["bar"].read) # ここが嫌な感じです。 len = cgi["bar"].length body = cgi["bar"].read ... StringIO.new("") を返すのが一番まともではないでしょうか。こういう使い 方になると思います。 if cgi["bar"].length > 0 ... どうでしょうか。 --- cgi.rb.orig Wed Jul 23 04:15:43 2003 +++ cgi.rb Wed Jul 23 22:02:43 2003 @@ -917,6 +917,7 @@ if ("POST" == env_table['REQUEST_METHOD']) and %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n.match(env_table['CONTENT_TYPE']) boundary = $1.dup + @is_multipart = true @params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH'])) else @params = CGI::parse( @@ -964,8 +965,12 @@ def [](key) params = @params[key] value = params[0] - value ||= "" - Value.new(value,params) + if @is_multipart + return value || StringIO("") + else + value ||= "" + Value.new(value,params) + end end def keys(*args) -- HORIKAWA Hisashi (in Kanji: 堀川 久) Netsphere Laboratories http://www.nslabs.jp/