0

PC から Linux サーバーにファイルをアップロードするための perl CGI スクリプトがあります。

独自の HTML フォームで CGI への呼び出しを記述して実行すると、意図したとおりに機能しますが、同じ呼び出しを既存のアプリケーションに配置すると、ファイルはサーバー上に作成されますが、データは取得されません。サイズゼロです。

環境変数 (から抽出できるもの) を比較し%ENVましたが、原因のようには見えません。実際に、自分の HTML スクリプトのいくつかの ENV を、既存のアプリケーションが使用していた値に変更してみましたが、問題は明らかになりませんでした。

ログには何も手がかりがありません。アップロード操作は成功したと考えています。ユーザーは両方のテストで同じです。アクセス許可が問題になると、ファイルはサーバー上に作成されません。

IE でも Chrome と同じ結果が得られます (アプリケーション内からではなく、独自の HTML スクリプトから動作します)。

比較するために、どのような特定のセットアップを検討する必要がありますか?

これはアップロードコードです:

if (open(UPLOADFILE, ">$upload_dir/$fname")) {
    binmode UPLOADFILE;

    while (<$from_fh>) {
        print UPLOADFILE;
    }
    close UPLOADFILE;
    $out_msg = "Done with Upload: upload_dir=$upload_dir fname=$fname";
}
else {
    $out_msg = "ERROR opening for upload: upload_dir=$upload_dir filename=$filename";
}

私はそれを確認しました

  • アプリケーション内から実行する場合、while ループには入りません。
  • 自分の HTML スクリプトから呼び出すと、while ループに入ります。

の値は$from_fh両方の実行で同じです。以下のブロックで使用されるすべての値は、両方の実行でまったく同じです。

4

2 に答える 2

0

open のエラー結果を確認できますか?

my $err;
open(my $uploadfile, ">", "$upload_dir/$fname") or $err = $!;
if (!$uploadfile) {
  my $out_msg = "ERROR opening for upload: upload_dir=$upload_dir filename=$filename: $err";
}
else {
  ### Stuff
  ...;
}
于 2013-04-04T21:22:12.857 に答える
0

私の推測では、別のアプリケーションに埋め込んでいるという事実に基づいて、他のアプリケーションの一部である機能によってすべての入力が既に読み取られているということです。たとえば、このプログラムを CGI スクリプトの一部として使用しようとして、CGI.pm の param() 関数を使用していた場合、ファイル アップロード全体が既に読み取られています。したがって、自分のコードがファイルを再度読み取ろうとすると、データは既に準備されているため、ゼロ データを受け取ります。

于 2013-04-05T02:02:29.357 に答える