2013-03-08 16 views
5

サーバマシンからファイルをダウンロードできるcgi-perlスクリプトが必要です。 EX:ダウンロードリンクをクリックすると、「 として保存」ウィンドウが開き、ローカルマシンにファイルを保存できます。Perl CGIからWebブラウザ経由でファイルをダウンロードする

CGIを使用してWebページを作成しました。これを使用してサーバーにファイルをアップロードし、perlスクリプトを実行して他の形式に変換します(ここまでは完了です)。今度は、このファイルをシステムに戻す(ダウンロードする)必要があります。

#!/usr/bin/perl 
#print "Content-type: text/html\n\n"; 
my $filepath='/upload/testing.pm'; 

    print "Content-Type: text/html\n\n"; 

    open("DOWNLOADFILE", "<".$filePath); 
    while($fileContents = <DOWNLOADFILE>) { 
     print $fileContents; 
    } 
print "Content-Type: text\n"; 
print "Content-Disposition: attachment; filename='testing.pm'\n"; 
print "Content-Description: File to download\n\n"; 
    close DOWNLOADFILE; 

私は別の形式にファイルを変換するとdir EXに新しく変換されたファイルを保存しますperlスクリプトを持っているサーバマシンに私のマシン(クライアント)からファイルをアップロードします:/ upload->ここまで私はスクリプティングでやりました。

このファイルをブラウザを使用してクライアントマシンにダウンロードする必要があります。この場合、私はtesting.pmファイルをクライアントマシンにダウンロードしようとしていました。

+0

何を試しましたか?コードを尋ねるのは本当に良いマナーではありません –

+0

返事のためにロバートに感謝します....私は主な質問のコードを更新しました。 – Tanuj

答えて

5

HTMLヘッダーを並べ替えることができました。 ここに作業スクリプトがあります。これをそのまま使用することができます

use CGI; 
my $html= new CGI; 
#get the file name from URL ex. http://<server_IP>/cgi-bin/download.cgi?a=testing.txt 
my $file= $html->param('a'); 
# $file is nothing but testing.txt 
my $filepath= "/var/www/upload/$file"; 

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

open FILE, "< $filepath" or die "can't open : $!"; 
binmode FILE; 
local $/ = \10240; 
while (<FILE>){ 
    print $_; 
} 

    close FILE; 
# use Unlink if u want to delete the files after download. 
#unlink ($filepath); 
+0

ああ。私はあなたがあなた自身の答えを受け入れることができるか分からなかった。それは...壊れているようだ。 –

+1

クラッカーがサーバー上のすべてのパスワードにアクセスできるようにするバグを修正しました。 - http://mag-sol.com/articles/cgi2.html –

+0

@DaveCrossこのリンクは現在死んでいるため、そのバグを説明できますか? – CJ7

3

私はあなたのコンテンツの処分ヘッダーを間違って記述したと思います。それは "添付ファイル"でなく、 "添付ファイル"でなければなりません。

アップデート(以下、次のコメント):

オクラホマので、私はあなたがCGIヘッダー(Content-Typeの:text/htmlの)印刷していることがわかり、さらに見て、後で、2つの改行が続くのと、より多くのCGIヘッダを印刷し、ブラウザがそれらに気付くことを期待する。応答の最初の空白行は、ヘッダーが終了したことをブラウザーに通知します。したがって、ヘッダーの2番目のバッチは内容として見えます。

の内容を、の2番目のヘッダーセットの前に印刷しています。ヘッダーではなくフッターにする:

ヘッダーを1つだけ返すようにコードを並べ替える必要があります。そして、あなたはデータを返します。

+0

コード内の正しいこと、私は私のIDEからここに私はそれを間違ってコピーコードを貼り付けると信じています。 – Tanuj

+0

ファイルをダウンロードするためのHTMLヘッダーを理解するのにしばらく時間を費やした..ソリューションを提案してくれてありがとうございます..私は下の作業スクリプト... – Tanuj