2009-08-28 9 views
5

WebアプリケーションはCGI :: Applicationを使用してApache mod_perlで動作します。私は生成されたファイルのダウンロードを提供したいと思います。以前は(私たちはmod_perlとCGI :: Appを使用する前に)生成されたので、STDOUTにcsvファイルをスプールしました。今私はもう少し洗練された - Spreadsheet :: WriteExcelを使ってExcelスプレッドシートを作成していますが、ファイルハンドルから印刷することはできません。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で動作していることを言及する必要があります。私の現在の回避策は、ファイルを作成し、そのファイルへのリンクをユーザーに提供することです。しかし、ディレクトリをクリアするときとそうするときに、さらに生成されたファイルへのアクセスのための認証に関して、それはより多くの問題を提起する。

提案?批判を傷つける?

答えて

4

STDOUTをつぶす必要はありません。 CGI-Appはあなたのために適切に処理する必要があります。また、データを送信する前にファイルハンドルを閉じる必要があるかもしれません。

Excelデータに適切なコンテンツタイプを設定していないようです。 text/html以外の場合は、手動で設定する必要があります。あなたはまた、代わりにメモリ内全体スプレッドシートを作成するのではなく、あなたがファイルに書き出す必要がありますどちらかと彼らはそれをストリームCGI::Application::Plugin::Stream

+0

ええ、私はそれを返すことができるように変数にフラッシュするようにファイルハンドルを閉じることを推測します。また、 '-attachment => 'filename.xls''をヘッダーに追加する必要がありました。または、ファイアウォールはファイルの処理方法を理解できませんでした。 私はCGI :: A :: P :: Streamを見ていきますが、作成しているファイルは十分に大きくすべきではありません。 ありがとう! – wes

3

ブックを閉じるとします。また、ファイルハンドルを閉じます。

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. 
4

に興味がある可能性があり

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の下で扱いにくいかもしれません。ありません)。

そして、完了したらワークブックを閉じてください。

関連する問題