![]() |
| カレッヂ |
質問者 ため
投稿日 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裏技 |