HTMLでファイルをアップロードするには(今、受け手は、CGIとします)、
こんな風に書けばいい
<html> <head><title>ファイル送信テスト</title></head> <body> <h1>ファイル送信テスト! </h1> <form action="http://127.0.0.1/cgi-bin/FileSend.cgi" method="post" enctype="multipart/form-data"> <input name="file" type="file" size="50"><BR> <input name="zikko" type="submit" value="送る!"> </form> </body> </html> |
(上記< > ¥は、本当は半角です)
こう書くと、"http://127.0.0.1/cgi-bin/FileSend.cgi(ローカルホストのcgi置き場にあるFileSend.cgi)に、アップロードしたデータが渡される。
では、そのアップロードしたデータは、どーいう形で送られるのか?
上記CGI(FileSend.cgi)を、以下のように書くと、ブラウザに、送られてきた内容を、そのままかえす形になる。
#!c:/perl/bin/Perl.exe use CGI; #引数を取得 if ( $ENV{'REQUEST_METHOD'} eq "POST" ) { read (STDIN, $qs, $ENV{'CONTENT_LENGTH'}); } else { $qs = $ENV{'QUERY_STRING'}; } $rsv = $qs; #書き出し print "Content-Type: text/plain¥n¥n"; print $rsv; exit; |
(上記< > ¥は、本当は半角です)
このとき、C:/temp/test.txtに、Hello World という言葉だけを入れたファイルをアップロードすると、こんなかんじでかえってくる。
-----------------------------7d7ab2c450266 Content-Disposition: form-data; name="file"; filename="C:¥temp¥test.txt" Content-Type: text/plain Hello World -----------------------------7d7ab2c450266 Content-Disposition: form-data; name="zikko" 送る! -----------------------------7d7ab2c450266-- |
(上記< > ¥は、本当は半角です)
つまり、普通の引数の入り方と違うので、よくCGIのサンプルプログラム
にある書き方ではできない。
どーするか。。
こーすると、できるみたい。
以下、ファイルの内容をブラウザに返すCGI(FileSend.cgi)
(ただし、テキストの場合のみ。他の場合には、もっと複雑あるよ)
#!c:/perl/bin/Perl.exe use CGI; # ファイル名の取得 $query = new CGI; $filename = $query->param('file'); #ファイルを読み込む $file = ""; while($bytesread = read($filename, $buffer,2048)) { $file .= $buffer; } #そのまま書き出す print "Content-Type: text/plain¥n¥n"; print $file; exit; |
(上記< > ¥は、本当は半角です)
●参考にしたサイト
CGI.pmを使ったファイルのアップロードの簡単なサンプル
http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html
ここに、もっと複雑な場合について、書いてあるよ!
P.S
あたりまえのことだけど、CGIプログラムでファイル名をうけとって、そのファイルを読み込んでいますが、これは、formで送られたデータの中にあるファイルの名前のこと。
(サーバー側にある同名のファイルが読めるわけではない)