如何从perl脚本中创建和下载csv文件?

问题描述 投票:0回答:1

我可以很容易地创建一个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: $!";

这段代码试图将文件写入磁盘。写入的文件似乎与下载的文件不一样。我不想要一个文件写入磁盘。有没有什么方法可以在内存中创建这个文件,然后设置头文件供下载?

提前感谢您提供的任何帮助。

csv perl cgi
1个回答
1
投票

从你打印的两个头可以看出,在CGI程序中,任何你想发回给客户端(例如浏览器)的数据都应该只打印到以下地址 STDOUT.

所以,我认为你的修复方法很简单,只要改成

$csv->print ($fh, $_) for @rows;

打印到 STDOUT 来代替。

$csv->print (STDOUT, $_) for @rows;

你也可以删除任何涉及到处理文件的代码 现在你不再使用。

© www.soinside.com 2019 - 2024. All rights reserved.