【问题标题】:How to download a string as a .csv file, without writing the string to a file and reading from the file?如何将字符串下载为 .csv 文件,而不将字符串写入文件并从文件中读取?
【发布时间】:2013-07-04 18:55:49
【问题描述】:

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

【问题讨论】:

  • 那么,您更改了 Content-Type,现在浏览器的行为有所不同?你试过改回来吗?
  • 不应该是text/csv吗?

标签: perl download cgi


【解决方案1】:

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

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

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

【讨论】:

  • 我首先使用 print "Content-type:text/html\n" 开始我的 perl 脚本 - 这是因为我使用该 perl 脚本来打印 html 页面。但是,在同一个文件中,我还想要一个下载代码,正如 Julian 所说,我必须在其中使用 print "Content-type:text/csv"。但是当我这样做时,浏览器只考虑第一个 Content-type,它实际上是 html 格式,并在页面上打印“Content-type:text/csv”行。那么,为了关闭 html content-type 并打开这个 text/csv 内容类型,我需要做什么呢?
  • 稍微编辑了响应。如果你添加最后提到的两行呢?
  • 我做了,它在屏幕上打印了这些行。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 2016-10-22
    • 2019-09-17
    • 1970-01-01
    • 2011-08-18
    • 2011-01-06
    • 2021-01-11
    • 2011-10-24
    相关资源
    最近更新 更多