青山です。

On Fri, 12 Nov 1999 00:13:34 +0900,
Toyofuku <toyofuku / juice.or.jp> wrote:

> | <FORM ACTION="xxx.cgi" METHOD=POST ENCTYPE="multipart/form-data">
> | <INPUT TYPE=FILE NAME=uploaded_file>
> | <INPUT TYPE=SUBMIT>
> | </FORM>
> | ----------
> | の場合、
> | ----------
> |     use CGI;
> |     $query = new CGI;
> |     $filename = $query->param('uploaded_file');
> |     # Copy a binary file to somewhere safe
> |     open(OUTFILE,">>/usr/local/web/users/feedback");
> |     while ($bytesread=read($filename,$buffer,1024)){
> |         print OUTFILE $buffer;
> |     }

> (質問1)
>   これと同様のことを ruby でできますか。

同じように書くと、こんな感じでしょうかね。

require 'cgi'
query = CGI.new
file = query.params['uploaded_file'][0]
outfile = File.open("/usr/local/web/users/feedback", "w")
while buffer = file.read(1024)
  out_file.print buffer
end

もっとも、query.params['uploaded_file'][0] がすでに File(Tempfile) オ
ブジェクトなので、実際にはこのようにコピーしなくても、そのまま
query.params['uploaded_file'][0].gets 等で読み出して使えますし、params
メソッド経由でなく query['uploaded_file'][0] でもいけます。

require 'cgi'
query = CGI.new
while line = query['uploaded_file'][0].gets
  line.gsub!(/foo/, "bar")
  print line
  # 等々、お馴染みの作業
end

> (質問2)
>   <input type=file ...> だと一ファイルずつ選んでいか
> なければならないので <select ...> ... </select>等で
> 複数ファイルを選んでから一気にアップロードしたいのです
> が可能でしょうか。

まず、select エレメントの要素は option エレメントで、option エレメント
の要素はテキストですから、ファイルは扱えません。

また、input エレメント以外にはファイルを扱えるエレメントは無いと思いま
すから、これを並べる以外に方法は無いでしょう。

という事で、複数ファイルをまとめて選択するというエレメントがありません
から、複数ファイルをまとめて選択できるクライアントも無いと思われます。

> (質問3)
>   もし上記のことができるとして(Rubyには申し訳ないですが)
> 「できれば perl で実装してくれないか」と言われるのは必至
> なので perl での方法もあればお願いします。

どうしてもやりたいという事であれば、複数の <INPUT TYPE="FILE"> を並べ
たフォームに対するレスポンスと同じ応答をするクライアントを自作という事
になるでしょうか。

> (質問4)
>   JavaScript を使ってローカルマシンのファイル名の一覧を
> ブラウザに表示することができるでしょうか。Java Applet では?

JavsScript や Applet って、ファイル操作が禁止されていませんでしたっけ?
もしそれが出来ると、ユーザーに知られないようにファイル名の一覧を得る事
も出来ますよね。

さらには、ファイル名が得られれば、フォームに紛れさせて、そのファイルを
盗む事も出来てしまうかもしれません。

という事で、http での複数ファイルの一括アップロードの手段としては、オ
リジナルクライアントという事になるかと思いますが、それよりは、ftp を併
用して、ユーザーには適当な使いやすい ftp クライアントを使ってもらうの
が良いような気がします。


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