我有以下CGI脚本,它启动一个模块,创建一个PNG文件,然后显示它。
#!/usr/bin/perl
use RRDs;
use CGI;
main:
{
my $cgi = new CGI;
my $filename = $cgi->param('filename');
print "Content-type: text/html\n\n";
my $curr_time = time();
my $start_time = $curr_time-3600;
RRDs::graph("$filename", "--start", "$start_time", "DEF:DiskC=c.rrd:DiskC:AVERAGE", "AREA:DiskC#0000FF");
my $err = RRDs::error();
print "<HTML><HEAD><TITLE>Disk C Utilization</TITLE></HEAD><BODY><H1>Disk C Utilization</H1><BR>$err<img src=\"$filename\"/></BODY></HTML>";
}
图表方法表示无法创建PNG文件。如果我在一个命令中运行这个脚本就好了,所以我认为这是一个权限问题。我已经在cgi-script文件夹上设置了chmod 755。你有什么建议?这与Apache2设置有关吗?
答案 0 :(得分:3)
嗯,查看日志:) CGI Help Guide
$ filename不是您要使用的文件名,它可以是浏览器发送的任何内容,甚至是F:/bar/bar/bar/bar/bar/bar/bar/UHOH.png
您的服务器上不太可能存在F:/bar/bar/bar/bar/bar/bar/bar/UHOH.png
你想生成一个文件名,可能就像this
sub WashFilename {
use File::Basename;
my $basename = basename( shift );
# untainted , only use a-z A-Z 0-9 and dot
$basename = join '', $basename =~ m/([.a-zA-Z0-9])/g;
# basename is now, hopefully, file.ext
## so to ensure uniqueness, we adulterate it :)
my $id = $$.'-'.time;
my( $file, $ext ) = split /\./, $basename, 2 ;
return join '.', grep defined, $file, $id, $ext;
} ## end sub WashFilename
您还希望将文件放在将为图像提供服务的网络服务器目录中(不是cgi-bin)
并且您还希望使用File::Type::WebImages
使用魔法确定Web图像文件类型,并确保文件名具有相应的扩展名,因此您的服务器将发送相应的头
不要忘记chmod
文件
答案 1 :(得分:1)
chmod 777
解决了我的问题!
答案 2 :(得分:0)
不要将文档存储到文件中,除非您有理由:它很慢并且会引入各种潜在危险。
您似乎没有在不同的请求上重复使用相同的图像,这可能是这样的原因。
相反,请教您的CGI脚本直接输出图像,具体取决于它的调用方式(或写第二个图像)。