Мое веб-приложение работает на Apache mod_perl
с использованием CGI :: Application. Я хочу предоставить загрузку сгенерированного файла. В прошлом (до того, как мы использовали mod_perl
и CGI :: App), я только размолвил файл csv до STDOUT
по мере его создания. Теперь я снимаю для немного более утонченности - создание электронной таблицы Excel с использованием Spreadsheet :: WriteExcel - и я не могу показаться, что вы ее распечатали из дескриптора файла.Как я могу предоставить загрузку временного файла с помощью mod_perl и CGI :: Application?
sub export_list {
my $self = shift;
binmode(STDOUT);
my $str;
open my $fh, '>', \$str;
my $workbook = Spreadsheet::WriteExcel->new($fh);
my $worksheet = $workbook->add_worksheet();
$worksheet->write_col(0,0, ['some','data','here']);
warn $str;
return $str;
}
Выходной сигнал - это всего лишь пустой ответ, а предупреждение также пустое.
Метод, который я использую, чтобы написать таблицу в дескриптор файла, довольно прямо из documentation, поэтому я предполагаю, что проблема связана с некоторыми CGI :: App noobery с моей стороны. Предложенные в документации методы для дескрипторов файлов и mod_perl
оказались довольно бесплодными.
Я думаю, я должен упомянуть, что я работаю в Windows, и что мое текущее обходное решение - создать файл и предоставить пользователю ссылку на него. Тем не менее это создает больше проблем в отношении очистки каталога и когда это делается, а также проверки подлинности для доступа к сгенерированным файлам.
Предложения? Резкая критика?
Да, я думаю, что закрытие дескриптора файла заставляет его сбрасываться на переменную, чтобы я мог вернуть его. Кроме того, мне пришлось добавить '-attachment => 'filename.xls'' в заголовок, или firefox не мог понять, что делать с файлом. Я рассмотрю CGI :: A :: P :: Stream, но файлы, которые мы создаем, не должны быть достаточно большими, чтобы иметь значение. Спасибо! – wes