On Tue, 26 Jul 2005 14:32:44 +0900
In article <20050726132947.4B7D.HAYASHI / meme.ne.jp>
[[ruby-list:40936] multipartフォームから受け取ったオブジェクトにstatメソッドでエラー]
ミーム 林 秀樹 <hayashi / meme.ne.jp> wrote:

> multipartフォームから受け取った画像ファイルを、
> サイズを確認して、保存する処理をしているのですが、
> 10KB以下のファイルを送信すると、'stat'に対してNoMethodErrorが
> 出てしまいます。
> 10KBより大きなファイルだと正常に処理するので、
> なにか仕様的な事でしょうか。
 :
> undefined method `stat' for #<StringIO:0x4060274c> (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