【问题标题】:How to create and download a csv file from perl script如何从 perl 脚本创建和下载 csv 文件
【发布时间】:2020-09-07 03:53:03
【问题描述】:

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

此代码正在尝试将文件写入磁盘。写入的文件似乎与下载的文件不同。我不希望将文件写入磁盘。有没有办法在内存中创建这个文件然后设置下载的标题?

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

【问题讨论】:

  • 我必须查找“Content-Disposition: attachment”,我以前从未听说过。听起来它仍然是一个 RFC,不是官方的,也许没有在所有地方得到很好的实施?将您的 Content-Type 设置为 CSV 文件应该是什么,然后将 CSV 输出打印到控制台(浏览器)而不是文件?

标签: csv perl cgi


【解决方案1】:

从打印的两个标题中可以看出,在 CGI 程序中,您想要发送回客户端(例如浏览器)的任何数据都应该打印到 STDOUT

所以我认为你的修复就像改变一样简单:

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

改为打印到STDOUT

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

您还可以删除处理您现在不再使用的文件所涉及的任何代码。

【讨论】:

  • 谢谢戴夫。那改变奏效了。通常情况下,我忽略了一些简单的事情。
猜你喜欢
  • 2013-04-21
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2014-05-03
  • 2015-03-16
  • 2020-10-15
  • 1970-01-01
  • 2014-01-17
相关资源
最近更新 更多