2

我正在尝试通过 perl 发送 http 标头来强制下载文件。当前代码如下:

#!/usr/bin/perl
use strict;
use Session;
use CGI::Carp qw(fatalsToBrowser);

use HTTP::Headers;

HTTP::Headers->new(
                Content_type =>  'text/plain',
                Content_disposition => 'attachment; filename=export.txt',
            );
print 'just some text';
exit;

我也包括在内HTTP::Headers,但是当我运行它时,它会打印出文本而不是下载内容...

4

4 回答 4

3

您只是在构建HTTP::Headers,但它从未打印到标准输出。因此,您还必须调用该as_string方法:

my $h = HTTP::Headers->new(
                           Content_type =>  'text/plain',
                           Content_disposition => 'attachment; filename=export.txt',
                          );
print $h->as_string;

但这只是打印 HTTP 标头,没有标头和正文之间的分隔符。如果你想让 libwww-perl 为你做这件事,你也可以使用HTTP::Message

use HTTP::Headers;
use HTTP::Message;

my $h = HTTP::Headers->new(
                           Content_type =>  'text/plain',
                           Content_disposition => 'attachment; filename=export.txt',
                          );
my $content = 'just some text';
my $msg = HTTP::Message->new($h, $content);
print $msg->as_string;

更正确地说,您可能应该使用 "\r\n" 作为行终止符:

print $msg->as_string("\015\012");

另一种替代方法是使用CGI.pm, 并使用该header方法,该方法可用于设置响应 HTTP 标头。实际上,使用CGI.pm比使用HTTP::*类更常见。后者在处理获取网页时LWP::UserAgent更常用

于 2013-08-05T11:00:42.370 回答
2

当您使用 CGI 时,您可以在通过 CGI 打印标题时设置它:

my $q = CGI->new();
print $q->header(
  -type    => 'text/plain',
  -charset => 'iso-8859-1',
  -attachment => 'filename.txt',

);
于 2013-08-05T11:03:57.407 回答
1

好的,我想出了一个更简单的方法......

而不是使用HTTP::Headers我只是打印出以下几行:

print"Content-type:text/plain\n";
print"Content-disposition:attachment; filename=export.txt\n\n";

哪个成功了...

于 2013-08-05T11:13:36.543 回答
0

这是使用 CGI 模块的代码:

use CGI qw(:standard);
print header(-type => "text/plain", -content_disposition => "attachment; filename=filename=export.txt");            
print "just some text";
于 2016-01-12T17:58:09.837 回答