こんにちは。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;
No.1
- 回答日時:
どこでどんなエラーが出ていますか?
ローカル上では動くのですか?
この回答への補足
サーバー上では
実行エラー
CGIの実行時にエラーが発生しました。
と表示されます。
ちなみにローカルでは、
Files have been uploaded.
C:\Documents and Settings\User\My Documents\test.html
C:\Documents and Settings\User\My Documents\Wndows.txt
と表示され動いているようですがファイルの作成はされませんでした。
再確認したところ、2つのファイル
C:\Documents and Settings\User\My Documents\test.html
C:\Documents and Settings\User\My Documents\Wndows.txt
は、上書きされていました。
No.2
- 回答日時:
$file1 = param('file1');
これだと、単に$file1にはファイル名が入るだけなので、while(<$file1>){
で、エラーになります。
$file1 = upload('file1');
として、ファイルハンドルを取得する必要があるのでは?
単純に上記部分を変更するだけだと、最後の
$file1<br>
$file2<br>
の部分が、今度はエラーになってしまうので、こちらの部分は
$file1 = param('file1');
で取得する必要があると思いますが・・。
No.3
- 回答日時:
下の追加です。
$file1 = param('file1');
で受け取ったファイル名をそのまま
open OUT, "> $file1";
として出力していますが、このままだとファイル名が例えば
"C:\Documents and Settings\なんとかかんとか.txt"
というようにパス付きの名前になってしまう(Windowsの場合)ので、ファイル名だけを取り出す処理をする、もしくは、ファイル名を自分で指定した方がいいと思います。
No.4ベストアンサー
- 回答日時:
・とりあえず、冒頭に
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の実行時にエラーが発生しました。
と表示されます。ファイル名を指定して出力したりしたのですが、変わらずエラーとなります。
ただ、ローカルでは動いているのでサーバー側の何かの設定にひっかかっているのかもしれませんが・・・
No.5
- 回答日時:
そりゃ当たり前でしょうね。
$file1と$file2の引数として
受け取っているのは
Windowsでのアップするファイルのパス
そんなものUNIX系のシステムでエラー
出るのは当たり前。
C:\~\~
こんな場所にアップなんてできるはずないし
ファイル名は自分で作るか
パスを分割するスクリプトを書くかですね。
UNIX系、Mac系(Xは多分UNIX系? 9までは独自),
Windows系ではパスの書き方が違うのでそこら辺を
考慮してファイル名を検出するプログラムを書かないと
ダメ。
#3の人がそのことを書いているが
完全に無視している質問者。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Perl perlのflock関数でロックをかけたままopen関数で何度もファイルを開きなおすことはできますか 3 2023/05/01 22:25
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Ruby パイソンエラーについて 1 2022/12/24 14:07
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CGI
-
htmlからパラメータで、cgiに渡...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
SUN BBSの改造方法
-
pythonのnumpyでの列(縦)ベク...
-
vsftpd+sslでアップロードできない
-
HTML プルダウンメニューの選択...
-
Javascriptの変数をCGIに送る方法
-
perlで書いたcgiでsqliteの使い...
-
Webアプリケーションを作りたい!
-
WEBページを強制的に横画面で見...
-
『数字の3桁毎にカンマを付け...
-
HTMLからCGIへデータを引き継ぎ
-
チェックボックスで選択した内...
-
標準入力からデータが読込めない
-
VBで表示したホームページの...
-
open.window(javascript) を使...
-
CGI実行できない。ソースが表示...
-
↓の質問:テキストではなく、セ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl/cgi リダイレクトができない
-
htmlからパラメータで、cgiに渡...
-
フォントサイズを変えるには?
-
CGI経由でのPDFファイルをダウ...
-
CGI
-
プログラム実行中の待機ページ...
-
メイルフォームの本文が文字化け
-
Yomi-Searchのカテゴリを縦並び...
-
cgi(perl) sendmailの使い方
-
sendmail 送信先を複数設定す...
-
iis+cgiでmultipart/form-data...
-
<FORM TYPE="subumit">でデータ...
-
サーバー上のPDFにCGIでパスワ...
-
指定のフォルダに指定のファイ...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
select値をhiddenのvalueに渡し...
-
「value」に2つの値をセットす...
-
チェックボックスの返す値
-
INPUT TYPE
おすすめ情報