我可以很容易地创建一个CSV文件。
use Text::CSV_XS;
my $filename = "export.csv";
my $fh;
my $csv = Text::CSV_XS->new ({ binary => 1 });
$csv->eol ("\r\n");
my @rows = ();
push @rows, ['Col1','Col2','Col3'];
push @rows, ['a', 'b', 'c'];
push @rows, ['d', 'e', 'f'];
open $fh, ">:encoding(utf8)", $filename or die "$filename: $!";
$csv->print ($fh, $_) for @rows;
close $fh or die "$filename: $!";
但是如果我尝试用CGI脚本通过网络浏览器运行这段代码 下载的csv文件是空白的。
use strict;
use warnings;
use CGI;
use Text::CSV_XS;
my $filename = "export.csv";
print "Content-Type:application/x-download\n";
print "Content-Disposition: attachment; filename=$filename\n";
print "\n";
my $fh;
my $csv = Text::CSV_XS->new ({ binary => 1 });
# Specify newline as CR+LF
$csv->eol ("\r\n");
my @rows = ();
push @rows, ['Col1','Col2','Col3'];
push @rows, ['a', 'b', 'c'];
push @rows, ['d', 'e', 'f'];
open $fh, ">:encoding(utf8)", $filename or die "$filename: $!";
$csv->print ($fh, $_) for @rows;
close $fh or die "$filename: $!";
这段代码试图将文件写入磁盘。写入的文件似乎与下载的文件不一样。我不想要一个文件写入磁盘。有没有什么方法可以在内存中创建这个文件,然后设置头文件供下载?
提前感谢您提供的任何帮助。
从你打印的两个头可以看出,在CGI程序中,任何你想发回给客户端(例如浏览器)的数据都应该只打印到以下地址 STDOUT
.
所以,我认为你的修复方法很简单,只要改成
$csv->print ($fh, $_) for @rows;
打印到 STDOUT
来代替。
$csv->print (STDOUT, $_) for @rows;
你也可以删除任何涉及到处理文件的代码 现在你不再使用。