如何使用mod_perl和CGI :: Application提供临时文件下载?

wes*_*wes 5 apache perl mod-perl download cgi-application

我的网络应用程序mod_perl使用CGI :: Application 在Apache上运行.我想提供生成文件的下载.在过去(在我们使用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;
}
Run Code Online (Sandbox Code Playgroud)

输出只是一个空白响应,警告也是空白.

我用来将电子表格写入文件句柄的方法非常直接来自文档,所以我认为问题是由于我的一些CGI :: App noobery.文档建议的文件句柄方法,并mod_perl证明也没有结果.

我想我应该提一下我在Windows上运行,而我目前的解决方法是创建一个文件并为用户提供一个链接.然而,这会带来更多问题,例如清除目录以及何时执行此操作,以及访问生成的文件的身份验证.

建议?尖刻的批评?

fri*_*edo 4

你不需要搞乱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;
Run Code Online (Sandbox Code Playgroud)

}

您可能还对CGI::Application::Plugin::Stream感兴趣