如何从 perl 脚本创建和下载 csv 文件
How to create and download a csv file from perl script
我可以轻松创建 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: $!";
但是,如果我尝试通过 Web 浏览器 运行 此代码作为 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: $!";
此代码正在尝试将文件写入磁盘。写入的文件似乎与下载的文件不同。我不想将文件写入磁盘。有没有办法在内存中创建这个文件,然后设置 headers 进行下载?
提前感谢您提供的任何帮助。
正如您从打印的两个 headers 中看到的那样,在 CGI 程序中,您想要发送回客户端(例如浏览器)的任何数据都应该打印到 STDOUT
.
所以我认为您的解决方法就像更改一样简单:
$csv->print ($fh, $_) for @rows;
改为打印到 STDOUT
:
$csv->print (STDOUT, $_) for @rows;
您还可以删除处理您现在不再使用的文件所涉及的任何代码。
我可以轻松创建 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: $!";
但是,如果我尝试通过 Web 浏览器 运行 此代码作为 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: $!";
此代码正在尝试将文件写入磁盘。写入的文件似乎与下载的文件不同。我不想将文件写入磁盘。有没有办法在内存中创建这个文件,然后设置 headers 进行下载?
提前感谢您提供的任何帮助。
正如您从打印的两个 headers 中看到的那样,在 CGI 程序中,您想要发送回客户端(例如浏览器)的任何数据都应该打印到 STDOUT
.
所以我认为您的解决方法就像更改一样简单:
$csv->print ($fh, $_) for @rows;
改为打印到 STDOUT
:
$csv->print (STDOUT, $_) for @rows;
您还可以删除处理您现在不再使用的文件所涉及的任何代码。