• ベストアンサー

ファイルのアップロードができません。

Perl CGIモジュールを使ってファイルのアップロードをしたいのですが、うまくいきません。 以下HTML部分 =================================================================== <form action="test.cgi" enctype="multipart/form-data" method=post> 1つめのファイルを選択<input type="file" name="upimg1" size=40><br> <input type=submit value=アップロード></form> ==================================================================== 受け取るCGI ==================================================================== #!/usr/bin/perl use CGI qw(:standard); $upimg1 = param('upimg1'); open UP,"> ./img_dir/sample.jpg"; while(<$upimg1>){ print UP $_; } close UP print <<"EOL"; Content-type: text/html <html> <body> Files have been uploaded.<br> $file1<br> $file2<br> </body> </html> EOL exit; ===================================================================== 実際アップフォルダ内にはsample.jpgがあるのですが、0バイトできちんとアップされていません。 本をみて自分なりにやってみたのですが・・・ どこがまちがっていますか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> Linuxサーバーに上げるとうまくアップロードできました。ただ、windowsのloccalhostでテストするとアップってできないんでしょうか? 可能ですよ。 open UP,"> ./img_dir/sample.jpg"; print UP $file; close UP; を open UP,"> ./img_dir/sample.jpg"; binmode UP; print UP $file; close UP; として下さい。 binmodeはUNIX系では無視されますのでそのままにしておいても構いません。 > また、下の構文はどのような意味をあらわしているのでしょうか? > while (read($upimg1, $buffer, 2048)) { $file .= $buffer; } readはファイルからデータを読み出す関数です。 読み出すファイルは$upimg1なので、それを2048バイトずつ読んで$bufferに入れます。あとはそれをEOFまで繰り返せばファイル全ての情報が$fileに格納されます。 > ふと、ここで思ったのですが、 > open UP,"> ./img_dir/sample.jpg"; > とファイル名をsample.jpgではなくアップ元と同じファイル名にしたいのですが、可能なのでしょうか? もちろん可能です。 File::Basename と言うモジュールを使うと簡単にできます。 ファイル名は、 $FileName = basename($upimg1, ""); これで取り出す事ができます。 モジュールを使わないのであれば$upimg1にフルパスが格納されているので後はそれをsplit等を使ってやってご自分で分解して取り出して下さい。ただモジュールを使わない場合案外これが厄介です。クライアントのOSが限定されているのなら難しくないですが、全てのOSを考えると難しいです。 わたしはスクリプト内でファイル名を生成してやる方がはるかに簡単だと思いますが、特別な理由がない限り。

volvo850love
質問者

お礼

>binmodeはUNIX系では無視されますのでそのままにしておいても構いません。 localhostでアップできました。(激感動!!) >readはファイルからデータを読み出す関数です。 >読み出すファイルは$upimg1なので、それを2048バイトずつ読んで$bufferに入れます。 >あとはそれをEOFまで繰り返せばファイル全ての情報が$fileに格納されます。 なるほど!!なぜ2048バイトかはわかりませんが、すばらしい! >File::Basename と言うモジュールを使うと簡単にできます。 >ファイル名は、 >$FileName = basename($upimg1, ""); >これで取り出す事ができます。 ばっちりうまくいきました!!! 本当にうれしいです。 勉強になりました。 モジュール機能をいままで使っておらずこれほど簡単にできるのかとおもうと感動です。 PHPなみに楽になりますね!

その他の回答 (2)

回答No.2

> use CGI qw(:standard); > $upimg1 = param('upimg1'); > open UP,"> ./img_dir/sample.jpg"; > while(<$upimg1>){ > print UP $_; > } この部分を以下のように変更して下さい。 use CGI qw(:standard); $upimg1 = param('upimg1'); while (read($upimg1, $buffer, 2048)) { $file .= $buffer; } open UP,"> ./img_dir/sample.jpg"; print UP $file; close UP; これでアップロードできます。

volvo850love
質問者

お礼

解答ありがとうございます。 Linuxサーバーに上げるとうまくアップロードできました。ただ、windowsのloccalhostでテストするとアップってできないんでしょうか? また、下の構文はどのような意味をあらわしているのでしょうか? while (read($upimg1, $buffer, 2048)) { $file .= $buffer; } ふと、ここで思ったのですが、 open UP,"> ./img_dir/sample.jpg"; とファイル名をsample.jpgではなくアップ元と同じファイル名にしたいのですが、可能なのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

$query= new CGI; $upimg1 = $query->param('upimg1'); にしてみるとか

volvo850love
質問者

お礼

0バイトではなくなりました。選択した画像サイズがアップできましたが、jpegファイルをアップして表示ができませんね・・・