- 締切済み
CGI によるファイルのアップロード
こんにちは。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;
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- corocoro1616
- ベストアンサー率13% (12/87)
そりゃ当たり前でしょうね。 $file1と$file2の引数として 受け取っているのは Windowsでのアップするファイルのパス そんなものUNIX系のシステムでエラー 出るのは当たり前。 C:\~\~ こんな場所にアップなんてできるはずないし ファイル名は自分で作るか パスを分割するスクリプトを書くかですね。 UNIX系、Mac系(Xは多分UNIX系? 9までは独自), Windows系ではパスの書き方が違うのでそこら辺を 考慮してファイル名を検出するプログラムを書かないと ダメ。 #3の人がそのことを書いているが 完全に無視している質問者。
- rafysta
- ベストアンサー率45% (24/53)
・とりあえず、冒頭に 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>
- rafysta
- ベストアンサー率45% (24/53)
下の追加です。 $file1 = param('file1'); で受け取ったファイル名をそのまま open OUT, "> $file1"; として出力していますが、このままだとファイル名が例えば "C:\Documents and Settings\なんとかかんとか.txt" というようにパス付きの名前になってしまう(Windowsの場合)ので、ファイル名だけを取り出す処理をする、もしくは、ファイル名を自分で指定した方がいいと思います。
- rafysta
- ベストアンサー率45% (24/53)
$file1 = param('file1'); これだと、単に$file1にはファイル名が入るだけなので、while(<$file1>){ で、エラーになります。 $file1 = upload('file1'); として、ファイルハンドルを取得する必要があるのでは? 単純に上記部分を変更するだけだと、最後の $file1<br> $file2<br> の部分が、今度はエラーになってしまうので、こちらの部分は $file1 = param('file1'); で取得する必要があると思いますが・・。
補足
ご指摘の通りに直したんですが、やはり実行時エラーとなりました。
- moon_night
- ベストアンサー率32% (598/1831)
どこでどんなエラーが出ていますか? ローカル上では動くのですか?
お礼
再確認したところ、2つのファイル C:\Documents and Settings\User\My Documents\test.html C:\Documents and Settings\User\My Documents\Wndows.txt は、上書きされていました。
補足
サーバー上では 実行エラー CGIの実行時にエラーが発生しました。 と表示されます。 ちなみにローカルでは、 Files have been uploaded. C:\Documents and Settings\User\My Documents\test.html C:\Documents and Settings\User\My Documents\Wndows.txt と表示され動いているようですがファイルの作成はされませんでした。
補足
回答ありがとうございます。 指摘された事をほぼ丸写しして実行してみるのですが、やはりサーバー上で 実行エラー CGIの実行時にエラーが発生しました。 と表示されます。ファイル名を指定して出力したりしたのですが、変わらずエラーとなります。 ただ、ローカルでは動いているのでサーバー側の何かの設定にひっかかっているのかもしれませんが・・・