在perl中设置http标头以强制下载内容

时间:2013-08-05 10:37:07

标签: perl header http-headers

我试图通过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 个答案:

答案 0 :(得分:3)

你只是在构建HTTP::Headers,但它从未打印到stdout。所以你还必须调用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获取网页时,后者更常用。

答案 1 :(得分:2)

当您使用CGI时,可以通过CGI以这样的方式打印标题时设置它:

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

);

答案 2 :(得分:1)

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

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

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

这就是诀窍......

答案 3 :(得分:0)

这是使用CGI模块的代码:

use CGI qw(:standard);
print header(-type => "text/plain", -content_disposition => "attachment; filename=filename=export.txt");            
print "just some text";