Moja aplikacja internetowa działa na serwerze Apache mod_perl
przy użyciu aplikacji CGI :: Application. Chcę dostarczyć pobrany plik. W przeszłości (zanim korzystaliśmy z aplikacji mod_perl
i CGI :: App) właśnie wygenerowałem plik CSV do STDOUT
, ponieważ został wygenerowany. Teraz kręcę, by trochę bardziej wyrafinować - stworzyć arkusz kalkulacyjny Excela za pomocą arkusza kalkulacyjnego :: WriteExcel - i nie mogę tego wydrukować z uchwytu pliku.Jak mogę zapewnić pobranie pliku tymczasowego za pomocą mod_perl i 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;
}
Dane wyjściowe to tylko pusta odpowiedź, a ostrzeżenie jest puste.
Metoda, której używam do zapisywania arkusza kalkulacyjnego do uchwytu pliku, jest prawie prosta z documentation, więc zakładam, że problem jest spowodowany przez niektóre noobery aplikacji CGI :: App z mojej strony. Sugerowane metody dokumentacji uchwytów plików i mod_perl
okazały się również bezowocne.
Chyba powinienem wspomnieć, że używam systemu Windows i że moim obecnym obejściem jest utworzenie pliku i udostępnienie użytkownikowi łącza do niego. Stwarza to jednak więcej problemów w odniesieniu do czyszczenia katalogu i kiedy to zrobić, a także uwierzytelniania dostępu do wygenerowanych plików.
Sugestie? Zjadliwa krytyka?
Tak, domyślam się, że zamknięcie uchwytu pliku zmusza go do opróżnienia zmiennej, więc mogę ją zwrócić. Musiałem też dodać do nagłówka '-attachment => 'filename.xls'' lub firefox nie mógł się dowiedzieć, co zrobić z tym plikiem. Zajrzę do CGI :: A :: P :: Stream, ale pliki, które tworzymy, nie powinny być wystarczająco duże, aby mieć znaczenie. Dzięki! – wes