![](/img/trans.png)
[英]How can I write a Perl web app that supports CGI, FastCGI and mod_perl?
[英]How can I provide a temp file download using mod_perl and CGI::Application?
我的網絡應用程序使用CGI :: Application在Apache mod_perl
上運行。 我想提供生成文件的下載。 在過去(在我們使用mod_perl
和CGI :: App之前)我只是在生成時將一個csv文件假脫機到STDOUT
。 現在我正在進行一些改進 - 使用Spreadsheet :: WriteExcel創建一個Excel電子表格 - 我似乎無法從文件句柄中打印出來。
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;
}
輸出只是一個空白響應,警告也是空白。
我用來將電子表格寫入文件句柄的方法非常直接來自文檔 ,所以我認為問題是由於我的一些CGI :: App noobery。 文檔的文件句柄和mod_perl
的建議方法也證明是徒勞的。
我想我應該提一下我在Windows上運行,而我目前的解決方法是創建一個文件並為用戶提供一個鏈接。 然而,這會帶來更多問題,例如清除目錄以及何時執行此操作,以及訪問生成文件的身份驗證。
建議? 尖刻的批評?
你不應該搞亂STDOUT
; CGI-App應該在幕后為您正確處理。 在嘗試發送數據之前,您可能還需要關閉文件句柄。
但是,您似乎沒有為Excel數據設置正確的內容類型。 對於text / html以外的任何內容,您需要手動設置它。 嘗試這樣的事情:
sub export_list {
my $self = shift;
my $str;
open my $fh, '>', \$str or die "Can't open to var: $!";
my $workbook = Spreadsheet::WriteExcel->new($fh);
my $worksheet = $workbook->add_worksheet();
$worksheet->write_col(0,0, ['some','data','here']);
$workbook->close;
close $fh;
warn $str;
$self->header_add( -type => 'application/vnd.ms-excel' );
return $str;
}
你不應該在內存中創建整個電子表格,而應該將其寫入文件,然后在完成時將其流式化(使用CGI :: Application :: Plugin :: Stream可以在這里幫助,但是你仍然需要在之后清理它,但實際上每個Web應用程序都應該有一個定期清理的臨時目錄)或者在創建它時打印它(這意味着制作FH STDIN
而不是在mod_perl下可能更棘手或者可能不是)。
然后記得在完成后關閉工作簿。
您想要關閉工作簿。 也關閉文件句柄:
warn "length 1=".length($str);
$workbook->close();
close($fh) or die "error on close: $!";
warn "length 2=".length($str);
length 1=0 at wx.pl line 16.
length 2=5632 at wx.pl line 19.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.