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的调用不会失败,如果符合预期,它会执行下面的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具有相同的错误,尽管该字符看起来完全相同。
答案 0 :(得分:0)
但是它失败了,并没有以某种方式将我带到文件打开错误块,但是这样调用CGI脚本会产生错误。
脚本标题的提前结束?尝试从命令行运行CGI:
perl your_upload_script.cgi serverfpath=/opt/webhost/ims/DOCURVC/data
答案 1 :(得分:0)