Как создать CGI в HTML, чтобы при нажатии запустить системный вызов и загрузить данные - PullRequest
0 голосов
/ 22 ноября 2011

Я хочу иметь URL, который только при нажатии будет выполняться CGI.

<a href=/myweb/cgi-bin/mycgi_long_running.cgi?name=param>Some Param</a>

Одним щелчком мыши CGI будет выполнять следующие задачи:

  1. Найти файлы, связанные с заданными параметрами.
  2. Архивировать их
  3. Начать загрузку для пользователя

Как создать правильное состояние для скрипта CGIдля этого?

У меня есть следующий сценарий CGI, но не удалось:

use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw/:standard/;
my $query = CGI->new();


my $file = "listoffiles_withdir.txt";

my $searchkey = param('name');

 #untainting step skipped for briefness

# Begin searching terms and ignoring case
my @entries = `grep -i \"$searchkey\" $file`;
chomp @entries;

my  $outf = 'tempfile.txt';            # output file name
open ( OUTFILE, '>>', $outf)

foreach my $file (@entries}
   print OUTFILE "$file";
}

close(OUTFILE)

# This phase takes may take a long time to do 
# many files involved
system("tar -cf out.tar -T $outf");

# Next step, I'm stuck as how to let the web automatically download
# when the archiving is complete

Ответы [ 2 ]

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

Если файл tar создается внутри корня документа веб-сервера, вам не нужно открывать и передавать его через Perl, что может повысить производительность.Просто отправьте перенаправление после завершения обработки CGI.

В зависимости от того, сколько времени занимает процесс CGI, браузер может решить закрыть соединение из-за тайм-аута.Возможно, вы захотите, чтобы главная страница была страницей прогресса, используя JavaScript для обновления необычной строки прогресса и последний бит JavaScript, чтобы перенаправить пользователя к фактической загрузке файла.

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

Я давно этого не делал, но попробуйте поиграться с чем-то вроде этого:

print qq{Content-Disposition: attachment; filename="$outf"\r\n};
print qq{Content-Type: application/octet-stream; name="$outf"\r\n};

open(my $fh, "<", $outf);
my $buf;

while(read($fh, $buf, 100)) {
    print $buf;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...