プロが教えるわが家の防犯対策術!

こんにちは。Perl初心者です。
ファイルのアップロードのプログラムを作ったのですが(と言っても書籍の丸写しですが..)サーバー上でエラーになってしまいます。どこが間違っているか教えて下さい。
環境:@niftyのホームページ(CGIは許可されています。), PC: Windows XP

ソース:
#!/usr/local/bin/perl

use CGI qw(:standard);

$file1 = param('file1');

open OUT, "> $file1";
while(<$file1>){
  print OUT $_;
}
close OUT;

$file2 = param('file2');

open OUT, "> $file2";
while(<$file2>){
  print OUT $_;
}
close OUT;

print <<"EOL";
Content-type: text/html

<html>
<body>
Files have been uploaded.<br>
$file1<br>
$file2<br>
</body>
</html>

EOL

exit;

A 回答 (5件)

・とりあえず、冒頭に


use CGI::Carp qw(fatalsToBrowser);
と書くことを勧めます。これを書いておくとブラウザ上にエラーの内容が表示されます。

・ファイルをopenする時に、openが成功したかどうかを捕捉するようにした方がいいです。
or die "cannot write $file : $!";
これを書いておけばopenが成功しているかどうか確認できます。(Permissionの設定でエラーを起こしていることが多々あります。)

・HTMLにenctypeを指定していますか?(アップロードする時のみ、指定する必要があります)
enctype="multipart/form-data"

上を踏まえて、少し書き直したのが下になります。
CGI
#!/usr/local/bin/perl

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);

my $file = param('file');
my $fh = upload('file');

open OUT, '>', $file or die "cannot write $file : $!";
while(<$fh>){
print OUT $_;
}
close OUT;

print <<"EOL";
Content-type: text/html

<html>
<body>
Files have been uploaded.<br>
$file<br>
</body>
</html>

EOL

exit;


HTML
<html>
<body>
<form name="form1" enctype="multipart/form-data" method="post" action="test.cgi">
<input type="file" name="file" />
<input type="submit" name="Submit" value="送信" />
</form>
</body>
</html>

この回答への補足

回答ありがとうございます。
指摘された事をほぼ丸写しして実行してみるのですが、やはりサーバー上で

実行エラー
CGIの実行時にエラーが発生しました。

と表示されます。ファイル名を指定して出力したりしたのですが、変わらずエラーとなります。
ただ、ローカルでは動いているのでサーバー側の何かの設定にひっかかっているのかもしれませんが・・・

補足日時:2006/03/05 18:03
    • good
    • 0

そりゃ当たり前でしょうね。



$file1と$file2の引数として
受け取っているのは
Windowsでのアップするファイルのパス
そんなものUNIX系のシステムでエラー
出るのは当たり前。
C:\~\~
こんな場所にアップなんてできるはずないし
ファイル名は自分で作るか
パスを分割するスクリプトを書くかですね。
UNIX系、Mac系(Xは多分UNIX系? 9までは独自),
Windows系ではパスの書き方が違うのでそこら辺を
考慮してファイル名を検出するプログラムを書かないと
ダメ。

#3の人がそのことを書いているが
完全に無視している質問者。
    • good
    • 0

下の追加です。


$file1 = param('file1');
で受け取ったファイル名をそのまま
open OUT, "> $file1";
として出力していますが、このままだとファイル名が例えば
"C:\Documents and Settings\なんとかかんとか.txt"
というようにパス付きの名前になってしまう(Windowsの場合)ので、ファイル名だけを取り出す処理をする、もしくは、ファイル名を自分で指定した方がいいと思います。
    • good
    • 0

$file1 = param('file1');


これだと、単に$file1にはファイル名が入るだけなので、while(<$file1>){
で、エラーになります。
$file1 = upload('file1');
として、ファイルハンドルを取得する必要があるのでは?

単純に上記部分を変更するだけだと、最後の
$file1<br>
$file2<br>
の部分が、今度はエラーになってしまうので、こちらの部分は
$file1 = param('file1');
で取得する必要があると思いますが・・。

この回答への補足

ご指摘の通りに直したんですが、やはり実行時エラーとなりました。

補足日時:2006/03/03 14:40
    • good
    • 0

どこでどんなエラーが出ていますか?


ローカル上では動くのですか?

この回答への補足

サーバー上では

実行エラー
CGIの実行時にエラーが発生しました。

と表示されます。
ちなみにローカルでは、

Files have been uploaded.
C:\Documents and Settings\User\My Documents\test.html
C:\Documents and Settings\User\My Documents\Wndows.txt

と表示され動いているようですがファイルの作成はされませんでした。

補足日時:2006/03/03 11:54
    • good
    • 0
この回答へのお礼

再確認したところ、2つのファイル
C:\Documents and Settings\User\My Documents\test.html
C:\Documents and Settings\User\My Documents\Wndows.txt
は、上書きされていました。

お礼日時:2006/03/03 12:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!