Perl と html、Linux 上の CGI。フォーム フィールドでサーバー上の CGI に渡されるファイル パス名に関する問題。問題は、PC 側ではなく、Linux ファイル パスにあります。
私は 2 つのプログラムを使用しています。1) 何年も前に書かれたプログラム、perl プログラムで生成された動的 html で、フォームとしてユーザーに提示されます。必要なコードを挿入して、ユーザーが PC からファイルを選択して Linux マシンに配置できるように変更しました。
このプログラムは、Linux 側で必要なファイル パスを既に知っているため、このファイル パスを非表示のフォーム フィールドでプログラム 2 に渡します。
2) Linux 側の CGI プログラム。(1) のフォームが投稿されたときに実行されます。
奇妙な問題。私が渡すファイルパスには、非常に奇妙な問題があります。を使用して抽出できます
my $filepath = $query->param("serverfpath");
上記は、正確に正しいパスのように見えるものを $filepath に取り込みます。
しかし、それは失敗し、ファイルを開くエラーブロックに移動する方法ではなく、CGI スクリプトの呼び出しでエラーが発生します。
ただし、$filepath にまったく同じ文字列をハードコーディングして入力すると、機能し、ファイルが正常にアップロードされます。
例えば:
$fpath1 = $query->param("serverfpath");
$fpath2 = "/opt/webhost/ims/DOCURVC/data"
$fpath1 と $fpath2 を比較すると、それらが完全に等しいことがわかります。$fpath1 と $fpath2 の長さをチェックすると、それらがまったく同じ長さであることがわかります。
$fpath1 のデータを消去する方法を数多く試しました。私はそれをむしゃむしゃ食べます。非標準文字はすべて削除します。
$fpath1 =~ s/[^A-Za-z0-9\-\.\/]//g;
この:
my $safe_filepath_characters = "a-zA-Z0-9_.-/";
$fpath1 =~ s/[^$safe_filepath_characters]//g;
しかし、私が何をしても、 $fpath1 を使用するとエラーが発生し、 $fpath2 を使用すると機能します。
$fpath1 のデータのどこが間違っている可能性がありますか? $fpath2 と正常に比較されますが、等しくなく、視覚的にはまったく同じに見え、正確に同じ長さとして表示されますが、同じようには機能しません。
以下のファイルオープンブロックの場合。
$upload_dir = $fpath1
CGIが見つからないかのように、CGIのロードが完全に失敗します(CGIスクリプトの構文エラーが原因であることがわかっています)。
$uplaod_dir = $fpath2
ファイルのアップロードに成功しました
$uplaod_dir = ""
cgi の呼び出しは失敗せず、予想どおり、以下の if の else ブロックを実行します。
ファイルオープンブロックは次のとおりです。
if (open ( UPLOADFILE, ">$upload_dir/$filename" ))
{
binmode UPLOADFILE;
while ( <$upload_filehandle> )
{
print UPLOADFILE;
}
close UPLOADFILE;
$msgstr="Done with Upload: upload_dir=$upload_dir filename=$filename";
}
else
{
$msgstr="ERROR opening for upload: upload_dir=$upload_dir filename=$filename";
}
ハードコーディングされた同等の $fpath2 と同じように機能しない理由を見つけるために、$fpath1 に対して他にどのようなテストを実行する必要がありますか?
$fpath2 から $fpath1 に、一度に 1 文字ずつ文字置換を試みました。単一の文字でこれを行っても、文字はまったく同じように見えますが、$fpath1 は $fpath2 と同じエラーになります。