2013-08-05 62 views
1

我試圖通過perl發送http頭來強制下載文件。目前的代碼如下:在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但是當我運行它,它打印出的文本,而不是下載內容...

+0

向我們展示更多代碼,您是使用CGI還是其他Web框架? –

+0

我正在使用CGI,我添加了更多代碼 –

+0

您是使用CGI.pm還是手動構建CGI響應? –

回答

2

當您使用CGI,你可以通過CGI打印頭時方式設置:

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

); 
2

你只是構建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獲取網頁時更常見。

1

好,我想出了一個更簡單的方法...

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

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

其中的伎倆......

+2

我更喜歡使用Modul。爲什麼?因爲當事情發生變化時,模塊需要改變,而不是整個腳本。重點在於這種用途的可維護性:) – 2013-08-05 11:44:55

+0

'文本文件的內容類型:text/plain',通用二進制流的'application/octet-stream'。任何其他[MIME類型](https://en.wikipedia.org/wiki/Media_type)如果您事先知道該類型。 – Matthieu

0

這是使用CGI模塊的代碼:

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