• 締切済み

ファイルのアップローダーを動作させたい。

ファイルをサーバーへ格納するプログラムを検索して作成しました。 見よう見まねなのでおかしい部分があるかもしれません。 entry.cgi #!/perl/bin/perl my $buffer; my $query = CGI->new; my $fh = $query->upload('file') or die(qq(Invalid file handle returned.)); # Get $fh my $file = $query->param('file'); my $file_name = ($file =~ /([^\\\/:]+)$/) ? $1 : 'uploaded.bin'; open(OUT, ">$file_name") or die(qq(Can't open "$file_name".)); binmode OUT; while (read($fh, $buffer, 1024)) { # Read from $fh insted of $file print OUT $buffer; } close OUT; sample.html <HTM><BODY> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="./entry.cgi"> <TABLE BORDER="1"> <TR><TD ><B>CSVファイル</B></TD> <TD ><INPUT TYPE="FILE" NAME="filename"></TD></TR> <TR></TR> </TABLE> <BR> <BR> <INPUT TYPE="SUBMIT" NAME="GO" VALUE=" 登録の実行 "> </FORM> </BODY></HTML> 上記のプログラムを実行すると 「CGIWrap Error: Script Execution Failed」と表示されてしまいます。 500のサーバーエラーと同じと調べてわかったのですが、どこがどうおかしいのか?わかりません。 perlの記述が今まで自分が使用していたものと勝手が違うので分からない状態です。 アドバイスもらえると幸いです。

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

アップしたファイルを保存するディレクトリのパーミッションが、書き込み可能になっていますか? html や cgi を置くディレクトリのパーミッションは、書き込み権限を落としてあることが多いように 思います。その場合は、open(OUT, ">$filename") ... の行で失敗します。

hihin2003
質問者

お礼

回答ありがとうございます。 パーミッションは書き込み可能となってます。 確かに書込み禁止としていたら書き込みで失敗しますね。 その場合でもcgiエラーの500が出るのでしょうか?

回答No.3

気付いた点を何点か (1) <HTM> sample.htmlの<HTM>は<HTML>が正しいと思います。 (2) #!/perl/bin/perl 環境にもよりますが、このパスは合っていますか? (3) CGIアップロード有効 これも(2)と同様に環境によりますが、デフォルトでアップロードが 無効になっていることがあります。 CGI->newの前に $CGI::POST_MAX = 1024 * 1024; $CGI::DISABLE_UPLOADS = 0; などの設定が必要な場合があります。 (4) ヘッダの出力 これは本質でないですが、大抵CGIプログラムはhtmlヘッダを出力する 必要があります。CGIで何も出力する必要がなくても、htmlヘッダを 出力しないと、Webサーバがエラーを出す場合があります(これも 環境によります)。例えば、処理の最後に print $query->header("text/plain"); としておいた方がエラーを拝まなくて済むことがあります。

hihin2003
質問者

補足

回答ありがとうございます。 >(1) <HTM> >sample.htmlの<HTM>は<HTML>が正しいと思います。 そうですね。申し訳ございません。修正いたしました。 >(2) #!/perl/bin/perl >環境にもよりますが、このパスは合っていますか? はい。あっています。 >(3) CGIアップロード有効 >これも(2)と同様に環境によりますが、デフォルトでアップロードが >無効になっていることがあります。 >CGI->newの前に >$CGI::POST_MAX = 1024 * 1024; >$CGI::DISABLE_UPLOADS = 0; >などの設定が必要な場合があります。 ありがとうございます。修正いたしました。 >(4) ヘッダの出力 >これは本質でないですが、大抵CGIプログラムはhtmlヘッダを出力する >必要があります。CGIで何も出力する必要がなくても、htmlヘッダを >出力しないと、Webサーバがエラーを出す場合があります(これも >環境によります)。例えば、処理の最後に >print $query->header("text/plain"); >としておいた方がエラーを拝まなくて済むことがあります。 ありがとうございます。 ここに書かれている内容を修正して実行したのですが変化がありませんでした。 本来は、この内容で動作するものなのでしょうか? perlで作成しているのですが、すっかりわからなくなってしまいました。

回答No.2

プログラム内ではfileという名前でデータを受け取っていますが、 HTML側はfilenameになっています。 プログラムに合わせるのであれば <INPUT TYPE="FILE" NAME="filename"> ↓ <INPUT TYPE="FILE" NAME="file"> ですね。

hihin2003
質問者

補足

回答ありがとうございます。 htmlのソース修正いたしました。 しかし、まだ「CGIWrap Error: Script Execution Failed」の表示がされたまとなっています。

回答No.1

entry.cgiでuse CGI;が抜けています。 #!/perl/bin/perl my $buffer; ↓ #!/perl/bin/perl use CGI; my $buffer; としてみて下さい。

hihin2003
質問者

補足

回答ありがとうございます。 早速対応いたしました。 「CGIWrap Error: Script Execution Failed」と表示が変わりませんでした。 何か必要なモジュールがあるのでしょうか? perlのバージョンは5.8.8になります。