1

ユーザーが選択したオプションに基づいて、DB からデータを取得し、ダウンロード可能な形式でユーザーに提供する必要がある Web サイトを再設計しています。データを文字列変数にフェッチしていますが、それをファイルに書き込んでからダウンロード コードを書きたくありません。文字列をクライアント側のファイルにダウンロードしたい。これにはperlを使用しています。

以前は、この 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なので、どこが間違っているのでしょうか?

EDIT:理由を知りました。以前にhtmlコンテンツタイプを開いてから、途中でこの「Content-Type:text/plain\n」を開こうとしているためです-これがブラウザが混乱する場所です。さて、以前の html コンテンツ タイプを閉じて、この新しいコンテンツ タイプを開いてダウンロードする方法を教えてください。

4

2 に答える 2

2

これは、ブラウザが作成して送信するコンテンツタイプを表示しているためですprint "Content-Type:text/plain\n";-@Julianが言及しているように、その行を元に戻すか、行の後に行を追加して、これで問題が解決するかどうかを確認できます. その特定のコンテンツタイプでは実際に作業するために実際のファイルが必要になる場合があるため、他のコンテンツタイプを試すことができます (@Hunter McMillen の提案を参照)。その場合、ブラウザーはダウンロード/保存ダイアログを提供する可能性があります。print "Content-Type:application/x-download\n";text/plain

ブラウザを欺くために、次を追加する必要がある場合があります (および を削除しますtext/csv)。

print "Content-Type:application/x-download\n";     
print "Content-Disposition:attachment;filename=$ID\n\n"; 
于 2013-07-02T13:32:57.653 に答える
0

わかりました、1 つの応答に対して設定できるコンテンツ タイプは 1 つだけのようです。そのため、現在のページから別のページに移動し、そこでダウンロード コードを記述しています。助けてくれてありがとう!

于 2013-07-04T10:55:49.307 に答える