2013-07-02 57 views
1

我正在重新設計一個網站,根據用戶選擇的選項,我需要從數據庫中獲取數據,然後以可下載的格式將其提供給用戶。我將數據讀取到字符串變量中,但我不想將其寫入文件,然後編寫下載代碼。我想將字符串下載到客戶端的文件中。我正在使用perl。如何將字符串下載爲.csv文件,而不將字符串寫入文件並從文件讀取?

以前我是閱讀和使用本的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內容類型,然後在中間,我打開這個「內容類型:文本/純\ n」 - 這是哪裏瀏覽器會感到困惑。現在,有人可以告訴我如何關閉以前的HTML內容類型並打開這個新的內容類型下載?

+2

因此,您更改了Content-Type,現在瀏覽器的行爲有所不同?你試過把它改回來嗎? –

+1

不應該是'text/csv'嗎? –

回答

2

這是因爲瀏覽器查看的內容類型需要創建一個具有print "Content-Type:text/plain\n";發送 - 作爲@Julian提到,你可以嘗試改變這條線後面或text/plain行後加入print "Content-Type:application/x-download\n";,看看這個修復的東西。由於該特定的內容類型可能實際需要一個真正的文件來處理,所以您可以嘗試其他內容類型(請參閱@Hunter McMillen的建議),因爲在這種情況下,瀏覽器可能會提供下載/保存對話框。

您可能需要添加以下愚弄瀏覽器(和刪除text/csv):

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

我首先從我的perl腳本開始打印「Content-type:text/html \ n」 - 這是因爲我使用perl腳本來打印html頁面。但是,在同一個文件中,我還想要一個下載代碼,在這裏我必須使用Julian告訴的print「Content-type:text/csv」。但是當我這樣做時,瀏覽器只考慮第一種內容類型,這實際上是html格式,並在頁面上正確地打印「Content-type:text/csv」行。因此,爲了關閉html內容類型並打開這個文本/ csv內容類型,我該怎麼做? – Julyflowers

+0

稍作編輯回覆。如果添加最後提到的兩行,會怎麼樣?我做了 –

+0

,並在屏幕上打印這些行。 – Julyflowers

0

好吧,貌似只能有一個人響應內容類型集。所以,我現在正在導航到當前頁面的另一個頁面,我正在編寫下載代碼。謝謝你的幫助!