簡體   English   中英

如何使用mod_perl和CGI :: Application提供臨時文件下載?

[英]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感興趣

你不應該在內存中創建整個電子表格,而應該將其寫入文件,然后在完成時將其流式化(使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM