From: Tietew Date: 2005-07-26T17:43:41+09:00 Subject: [ruby-list:40937] Re: multipartフォームから受け取ったオブジェクトにstatメソッドでエラー On Tue, 26 Jul 2005 14:32:44 +0900 In article <20050726132947.4B7D.HAYASHI@meme.ne.jp> [[ruby-list:40936] multipartフォームから受け取ったオブジェクトにstatメソッドでエラー] ミーム 林 秀樹 wrote: > multipartフォームから受け取った画像ファイルを、 > サイズを確認して、保存する処理をしているのですが、 > 10KB以下のファイルを送信すると、'stat'に対してNoMethodErrorが > 出てしまいます。 > 10KBより大きなファイルだと正常に処理するので、 > なにか仕様的な事でしょうか。 : > undefined method `stat' for # (NoMethodError) 下にも出ているとおり Tempfile オブジェクトではなく StringIO オブ ジェクトになっていますので仕様と言えば仕様ですね。 > require "cgi" > cgi = CGI.new > file = cgi.params['file'][0] > filesize = file.stat.size ここで file.size とすれば Tempfile でも StringIO でもサイズを取 得できます。 > また、上記処理は大きすぎるファイルをアップロードされないように、 > サイズチェックをしているのですが、 > (サイズが一定以上だと警告メッセージを表示させています) > tempfileオブジェクトとして一旦受け取らないといけないので、 > 結局サーバーには負担がかかってしまいます。 > フォームからバイナリデータを受け取りながら、設定サイズを超えた時点で、 > エラー処理に移る方法が採れれば、より安全なのですが、 > そのような実装は可能でしょうか。 CGI.newの前で if ENV['CONTENT_LENGTH'].to_i >= 設定サイズ puts "Status: 413 Request Entity Too Large" puts "Content-Type: text/html" puts puts "適当なエラーメッセージ" exit end としてしまえば受け取らなくてすみます。 —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA