Perl 和 html,Linux 上的 CGI。文件路径名问题,在表单字段中传递给服务器上的 CGI。问题在于 Linux 文件路径,而不是 PC 端。
我正在使用 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";
}
我应该在 $fpath1 上执行哪些其他测试,以找出为什么它与硬编码等效 $fpath2 的工作方式不同
我确实尝试过字符替换,一次一个字符,从 $fpath2 到 $fpath1。即使对单个字符执行此操作,也会导致 $fpath1 与 $fpath2 具有相同的错误,尽管字符看起来完全相同。