【发布时间】: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 输出打印到控制台(浏览器)而不是文件?