1

我正在重新设计一个网站,根据用户选择的选项,我需要从数据库中获取数据,然后以可下载的格式将其提供给用户。我正在将数据提取到字符串变量中,但我不想将其写入文件然后编写下载代码。我想将字符串下载到客户端的文件中。我为此使用 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 内容类型并打开这个新的内容类型进行下载吗?

4

2 回答 2

2

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

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

print "Content-Type:application/x-download\n";     
print "Content-Disposition:attachment;filename=$ID\n\n"; 
于 2013-07-02T13:32:57.653 回答
0

好的,看起来一个响应只能设置一种内容类型。所以,我现在从当前页面导航到另一个页面,我正在那里编写下载代码。感谢您的帮助人们!

于 2013-07-04T10:55:49.307 回答