カレッヂ |
質問者 ため
投稿日 11/7(木) 18:20:34
今、仕事場で使用しているLinuxサーバーにファイルアップロードをするCGIを 作成しているのですが、実行すると、アップするファイルを読み込むところで サーバーエラーになってしまいます。どなたか助けていただけませんか? CGI.pmを使ったアップロードCGIです。(CGI_Lite.pmが使えないので・・) 下記の$ARGDirは、ファイルをアップするディレクトリです。 最後の方の、#がついた3行をはずして実行すると、サーバーエラーになります。 この状態ですと、目的のディレクトリにサイズ0バイトのファイルができます。 とりあえず、ファイルができるので、$newfileの方は問題ないと思っています。 $readfileの方も確認したのですが、Winのフルパスが入っていて、見た目上は 問題無さそうな気がします。 sub FileUpLoad { my $Readbyte =''; my $buffer =''; my $newfile =''; my $query = new CGI; my $readfile = $query->param('UPLDFILE'); my @newfile = split /\\/, $readfile ; if ($ARGDir eq ""){ $newfile = pop @newfile; } else { $newfile = $ARGDir . "/" . pop @newfile; } chomp $newfile; open (OUTFILE,"> $newfile") or &Error ("ファイルが作れません。",$newfile); #while ($Readbyte = read( $readfile , $buffer , 1024 )) { # print OUTFILE $buffer; #} close OUTFILE; }
プロバイダ参照:http://homepage.nifty.com/ |
質問者 ため
[削除]
投稿日 11/7(木) 18:23:01
あせっていたので、書き忘れました。 自宅は@niftyのhomepageなのですが、今回の質問は別のサーバーです。 |
回答者 やまだ
[削除]
投稿日 11/7(木) 23:31:13
my $readfile=$query->param('UPLDFILE'); で、$readfileは、ファイルハンドルではなく、ただの変数ですよ。 なんで、read FILEHANDLE, SCALAR, LENGTH; で、おかしくなるのですよ。 アップするファイルの内容は、$query->paramハッシュ表の中の一要素としてくると思われる(CGI.pm)ので、 ただの変数に格納わけで、readでは、ないですよね。 |
質問者 ため
[削除]
投稿日 11/8(金) 14:21:05
そうでしたか・・・。 ある本に、「スカラー変数にファイル名を入れて、ファイルハンドルのように扱うと、 アップロードファイルへのアクセスを取得する」って書いてあったので、そうした つもりなんですけれど・・・。 また、下記のURLも参考にしました。 http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html うーん。どうすればいいんでしょう・・・・。 |
回答者 まさ
[削除]
投稿日 11/8(金) 15:27:02
もっと単純化して試してみれば、原因の発見につながりやすいです。 このサンプルはWindows用ですので、UNIXではパスを適宜変えて下さい。 ------------------------------------------------------------------- #!/usr/local/bin/perl use CGI; $query = new CGI; $filename = $query->param('File'); while(read($filename, $buffer, 2048)) { $file .= $buffer; } @files = split(/\\/, $filename); ($basename, $exp) = split(/\./, $files[-1]); $new_file = $basename . "." . $exp; # ファイルを指定ディレクトリにコピー open(OUT, "> c:\\foo\\$new_file"); binmode(OUT); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "[$basename] [$exp]\n"; print "正常終了\n"; exit; |
質問者 ため
[削除]
投稿日 11/8(金) 18:13:54
ありがとうございます。 いただいたサンプルを元に、少し試してみます。 明日か、月曜日には、結果が報告できると思います。 うまくいくといいなあ・・・。 |
回答者 やまだ
[削除]
投稿日 11/8(金) 23:53:33
<INPUT TYPE="file" NAME="UPLDFILE" SIZE="64"> みたいにhtmlのUPLDFILEのTYPEの確認してみてください。 そうすると、$query->param('UPLDFILE'); できちんとファイルハンドルの変数を返してくれるようです。こちらで、動作確認しました。 |
回答者 まさ
[削除]
投稿日 11/9(土) 06:40:42
データをCGIに送るフォームで以下のようにENCTYPEを指定していますか? <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ これがないと正常にアップロードできませんよ。 これと上のサンプルで正常にデータがUPされます。 試してみてください。 |
質問者 ため
[削除]
投稿日 11/9(土) 14:58:30
ありがとうございました。なんとかアップロードできるようになりました。 原因は、ENCTYPEの指定と、CGIに送ったパラメータの受け取り方にあったようです。 やっと次のステップ(日本語ファイル名の処理)に取りかかれます。 |
このページは終了したので返信(回答)は書きこめません
Web裏技 |