CGI скрипт не может создать файл - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть следующий 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. Если я запускаю этот скрипт в команде, как она работает нормально, поэтому я думаю, что это вопрос разрешений. Я уже установил chmod 755 в папку cgi-script. Что ты предлагаешь? Это связано с настройками Apache2?

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Гм, проверьте логи :) Справочное руководство CGI

$ 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 - для определения типов файлов веб-изображений с помощью magic и убедитесь, что имя файла имеет соответствующее расширение, поэтому ваш сервер отправит соответствующие заголовки

И не забудьте chmod файл соответствующим образом

1 голос
/ 24 ноября 2011

chmod 777 решил мою проблему!

0 голосов
/ 24 ноября 2011

Не сохраняйте документ в файл, если у вас нет причины: он медленный и представляет все виды потенциальных опасностей.

Вы, похоже, не используете одно и то же изображение по разным запросам, что может быть такой причиной.

Вместо этого научите свой CGI-скрипт выводить изображение напрямую, в зависимости от того, как оно называется (или напишите второе, которое это делает).

...