青山です。

On Mon, 12 Jun 2000 01:43:39 +0900,
Wakou Aoyama <wakou / fsinet.or.jp> wrote:

> また、問題は eruby(.rhtml), mod_ruby(.mrb) どちらでも発生し、行ける時
> には、100MB 程度もきちんと行くので、ファイルサイズによるものでも無さそ
> うです。

apache -X で起動すると 100% 落ちますね。なぜ multipart form を受け取っ
た場合にだけ落ちるのかまでは不明ですが、引金は Apache::request#[],
Apache::request#send_http_header のようです。cgi.rb ではこれらを使わず
に通常のヘッダ出力を行なうようにすると、落ちなくなります。

実験用のスクリプトを付けておきます。


#!/usr/local/bin/ruby -T1

require "cgi"
cgi = CGI.new("html3")

cgi.out() do
  cgi.html("PRETTY"=>($DEBUG ? "  " : false)) do
    cgi.head{ cgi.title{ "file upload test" } } +
    cgi.body() do
      cgi.multipart_form() do
        cgi.file_field("uploaded_file") + cgi.br +
        cgi.file_field("uploaded_file") + cgi.br +
        cgi.file_field("uploaded_file") + cgi.br +
        cgi.submit()
      end +
      if cgi.has_key?("uploaded_file")
        cgi["uploaded_file"].collect() do |uploaded_file|
          cgi.hr +
          cgi.dl() do
            cgi.dt{ 'Content-Type: ' } +
            cgi.dd{ CGI::escapeHTML(uploaded_file.content_type) } +
            cgi.dt{ 'Original Filename: ' } +
            cgi.dd{ CGI::escapeHTML(uploaded_file.original_filename) } +
            cgi.dt{ 'Local Path: ' } +
            cgi.dd{ CGI::escapeHTML(uploaded_file.local_path) } +
            cgi.dt{ 'Size: ' } +
            cgi.dd{ CGI::escapeHTML(uploaded_file.stat.size.to_s)} +
            cgi.dt{ 'Body (head 200 bytes): ' } +
            cgi.dd{ cgi.pre{CGI::escapeHTML(uploaded_file.read(200) || "")}}
          end
        end.join()
      else
        ''
      end
    end
  end
end


<%
  require "cgi"
  cgi = CGI.new()
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
  <HEAD><TITLE>file upload test</TITLE></HEAD>
  <BODY>
    <FORM METHOD="post" ENCTYPE="multipart/form-data">
      <INPUT SIZE="20" NAME="uploaded_file" TYPE="file"><BR>
      <INPUT SIZE="20" NAME="uploaded_file" TYPE="file"><BR>
      <INPUT SIZE="20" NAME="uploaded_file" TYPE="file"><BR>
      <INPUT TYPE="submit">
    </FORM>
    <% if cgi.has_key?("uploaded_file") %>
      <% cgi["uploaded_file"].each() do |uploaded_file| %>
        <HR>
        <DL>
          <DT>Content-Type: </DT>
          <DD><%= CGI::escapeHTML(uploaded_file.content_type) %></DD>
          <DT>Original Filename: </DT>
          <DD><%= CGI::escapeHTML(uploaded_file.original_filename) %></DD>
          <DT>Local Path: </DT>
          <DD><%= CGI::escapeHTML(uploaded_file.local_path) %></DD>
          <DT>Size: </DT>
          <DD><%= CGI::escapeHTML(uploaded_file.stat.size.to_s) %></DD>
          <DT>Body (head 200 bytes): </DT>
          <DD><PRE><%= CGI::escapeHTML(uploaded_file.read(200) || "") %></PRE></DD>
        </DL>
      <% end %>
    <% end %>
  </BODY>
</HTML>


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>