CGI-BBS > CGI > Perl > CGIでアップロードするファイルが読み込めない。


カレッヂ
カレッヂ


質問者 ため  投稿日 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/
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:SAKURA
FTPソフト:FFFTP
サーバ移転:していない
改造:している
CGI習熟度:expert

質問者 ため  [削除]  投稿日 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裏技