如何将字符串下载为.csv文件,而无需将字符串写入文件并从文件中读取?

时间:2013-07-02 12:27:12

标签: perl download cgi

我正在重新设计一个网站,根据用户选择的选项,我需要从数据库中获取数据,然后以可下载的格式将其提供给用户。我将数据提取到字符串变量中,但我不想将其写入文件然后编写下载代码。我想将字符串下载到客户端的文件中。我正在使用perl。

以前我使用这个perl-cgi代码从文件中读取和下载:

...
my $ID = "details.csv";
my @fileholder;
my $filesloc = "/html/details.csv";

open(DLFILE,'<',"$files_loc") || Error('open','file');
@fileholder = <DLFILE>;
close(DLFILE)

print "Content-Type:application/x-download\n";
print "Content-Disposition:attachment;filename=$ID\n\n";
print @fileholder;

保存为 downloadscript.cgi 。但现在,我想在 .pm 文件中执行此操作,并且我将字符串值存储在@fileholder中。我尝试过:

my $ID = "details.txt";
my @fileholder = qw(name age address);
print "Content-Type:text/plain\n";
print "Content-Disposition:attachment;filename=$ID\n\n";
print @fileholder;
<。>在.pm文件中,但是它在屏幕上打印上面的行而不是打开“另存为”对话框。两者都是perl,所以我哪里错了?

编辑:我知道原因,因为我之前打开了一个html内容类型,然后在中间,我打开了这个“Content-Type:text / plain \ n” - 这就是浏览器迷茫。现在,有人可以告诉我如何关闭以前的html内容类型并打开这个新的内容类型进行下载吗?

2 个答案:

答案 0 :(得分:2)

这是因为浏览器正在查看您创建的内容类型并使用print "Content-Type:text/plain\n";发送 - 因为@Julian提到您可以尝试更改该行或添加行{{1在print "Content-Type:application/x-download\n";行之后,看看这是否能解决问题。由于该特定内容类型实际上可能需要使用真实文件,因此您可以尝试其他内容类型(请参阅@Hunter McMillen的建议),因为在这种情况下浏览器可能会提供下载/保存对话框。

您可能需要添加以下内容以欺骗浏览器(并删除text/plain):

text/csv

答案 1 :(得分:0)

好的,看起来一个响应只能有一个内容类型集。所以,我现在正在导航到我当前页面的另一个页面,我正在编写下载代码。谢谢你的帮助!