人に聞けない痔の悩み、これでスッキリ >>

よろしくお願いします。

現在、ボタンを押すと(=CGI実行)フィルターによりCSVファイルが作成されるという様なものを開発しております。

しかし、その出来上がったCSVファイルをそのままダウンロードしたいと言う要望がありまして、そのCGIに組み込めないものかといろいろ調べております。

概要
(1)ボタンを押す(=CGI実行)
(2)フィルターによりCSVファイル作成
(3)作成されたファイルをダウンロード

という具合で、教えていただきたいのは(3)です((1)(2)は作成済み)。
実際にはCSVファイルは3つできるのですが、これらをまとめてダウンロード・・・というのはムリですよねぇ(第1希望)。
ムリなら、処理の中で圧縮させます(これぐらいはできます)ので、そのファイルをダウンロードさせるというやり方でも構いません(第2希望)。


実現が難しいようであれば実行結果画面に<a href= ~>で貼り付けます。

webサーバー・・・HP-UX
web・・・IE
CGI開発言語・・・Perl
開発端末・・・windows2000(Tera Term 使用)

以上、情報等お持ちの方いらっしゃいましたら、
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

CGIにて吐き出すソースのヘッダーを


Content-Type: text/csv
Content-Disposition: attachment; filename=××.csv
にすれば大丈夫です。
ただし、ひとつのファイルのみのダウンロードになります。

作成するCGIの流れは、
1.CSVファイルの作成
2.標準出力に上記ヘッダーを出力
3.標準出力にCSVファイルを出力
となります。

例、hoge.csvをダウンロードさせたい場合
#!/usr/local/bin/perl
print "Content-Type: text/csv\n";
print "Content-Disposition: attachment; filename=hoge.csv\n\n";

//----ここでCSV作成----
//できたCSVの中身を aaa,bbb,ccc,ddd とすると

print "aaa,bbb,ccc,ddd\n";


これでダウンロードCGIにリンクするとダウンロードダイアログが表示され、hoge.csvをダウンロードできます。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
上記参考に試したところうまくいきました。

お礼日時:2005/06/15 09:22

たびたびすみません。



扱われるファイルがZIPならば、標準出力に吐き出す際に、バイナリとして吐き出すように注意してください。

逆にCSVならばテキストモードで吐き出してください。

※参考ですが、ダウンロードさせたいファイルがZIPの場合、クライアント側で拡張子ごとの設定を行っていない限りは、ZIPファイルにリンクを張るだけでダウンロードが行えます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参考になりました。

お礼日時:2005/06/17 10:15

Perlでzipファイルを扱えるモジュールがあります(参考


URL)
これで圧縮したら、あとは#1さんの方法に準拠で。(ヘッダーをzipとする。)

参考URL:http://www.ss.iij4u.or.jp/~somali/web/_archive_z …
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

最終的に何をダウンロードするか(csv?,zip?)を確認して対応させていただきたいと思います。

お礼日時:2005/06/15 09:25

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサーバーのテキストファイルをダウンロード

Webページに「ダウンロード」というボタンかリンクがあり、それをクリックするとローカルコンピュータにWebサーバーにあるテキストファイルをダウンロードできるCGIを作成したいのですが・・・
以前に同じ質問を上げたら「Content-type: text/download
」としたらいいよ・・・と教えたもらったのですが、もひとつピンとこなくて、簡単なコーディング例みたいなものを誰か教えてください。
それだけわかったら自分でなんとかしろよ!と思われるかもしれませんが小生Perl初心者の為、???なのです。

Aベストアンサー

あれれ?うちではうまく行くんですが・・・
別のHTMLのリンクからCGIを起動してもだめでしょうか?
もしかしたら、サーバーかブラウザの問題なのかも知れません。だとすると、申し訳ないのですが分かりません。

Qホームページでファイルをダウンロードさせる

お世話になります。
会社のホームページを制作中です。
マニュアルなどをアップしておき、ユーザーにダウンロードしてもらうページを作ろうと思っています。
<ベクターのような>
参考になる情報ありましたら教えてください。
宜しくお願いいたします。

Aベストアンサー

ダウンロードについて、
参考URLのページに分かりやすく書いてあるようです。
例もあるのでぜひ参考にしてください。

参考URL:http://www.tohoho-web.com/wwwxx013.htm

QチェックボックスのCGIへの値の受け渡し方

チェックボックスで複数回答があった場合のデータの受け取りをどうしても分からないので教えてください。
別の人が作ったCGIを改造(今回の複数回答可の部分を)しています。以下のような記述だとvalue値が取れず、空白になっています。
【HTML】(チェックを2つ以上出来ないようにするためにJavascriptで制限をかけています。nameを同じにするやり方にしています。)
<INPUT type="checkbox" name="q1" value="赤" onclick="return limitation(this,2)">赤<br>
<INPUT type="checkbox" name="q1" value="黄" onclick="return limitation(this,2)">黄<br>
<INPUT type="checkbox" name="q1" value="青" onclick="return limitation(this,2)">青<br>
【CGI】
use CGI qw(:standard);
@check1=param("q1");
$result1=join(',',@check1);

print "<td width=300><font size=2>$result1</font></td>\n";

このPerlは@check1にq1のチェックが付いたものが格納されていると認識しています。では、どうしたらそれをとりだせるのでしょうか?初心者で申し訳ありません。やり方にこだわらず、今回の目標は
(1)チェックボックスに規定(2つ)以上のチェックが入るとアラートでチェックしすぎた瞬間に知らせてくれる
(2)2つチェックされた場合の値の取出しを可能にする。

チェックボックスで複数回答があった場合のデータの受け取りをどうしても分からないので教えてください。
別の人が作ったCGIを改造(今回の複数回答可の部分を)しています。以下のような記述だとvalue値が取れず、空白になっています。
【HTML】(チェックを2つ以上出来ないようにするためにJavascriptで制限をかけています。nameを同じにするやり方にしています。)
<INPUT type="checkbox" name="q1" value="赤" onclick="return limitation(this,2)">赤<br>
<INPUT type="checkbox" name="q1" value="黄"...続きを読む

Aベストアンサー

説明が悪かったかな。
先ほど表記したのは同じcheckboxの場合の受け取り方のテストスクリプトです。
受け取った配列をHIDDENで渡せば問題ありません。

ただ、私のほうでCGI.pmを使用したものをテストしたところ同じnameを使った場合は渡された文字列が連結されてしまうみたいです。

以下テスト用

#!/usr/local/bin/perl


use CGI;
$query = CGI->new;
$on = $query->param('on');

@params = $query->param();

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>test</TITLE></HEAD>\n";
print <<HTML;
<form action="chk.cgi" method="POST">
<input type="checkbox" name="q1" value="RED">RED<br>
<input type="checkbox" name="q1" value="BLUE">BLUE<br>
<input type="checkbox" name="q1" value="YELLOW">YELLOW<br>
<input type="submit" name="on" value="TEST">
</form>
HTML

if ($on) {
print "<p>変数result1: $result1</p>\n";
print "<p>配列q1<br>\n";
foreach $q1 (@check1) {
print "$q1<br>\n";
}

foreach $param (@params) {
print $param, ":\t", $query->param($param), "<br>\n";
}

}

print "</BODY>\n";
print "</HTML>\n";

exit;


以上でテストした結果:
q1: REDBLUEYELLOW
on: TEST

説明が悪かったかな。
先ほど表記したのは同じcheckboxの場合の受け取り方のテストスクリプトです。
受け取った配列をHIDDENで渡せば問題ありません。

ただ、私のほうでCGI.pmを使用したものをテストしたところ同じnameを使った場合は渡された文字列が連結されてしまうみたいです。

以下テスト用

#!/usr/local/bin/perl


use CGI;
$query = CGI->new;
$on = $query->param('on');

@params = $query->param();

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TIT...続きを読む

QHTML上(javascript)からCGIを実行する方法

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTMLファイルの一部にcgi処理結果を表示させたいものです。

そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの
実行結果を表示する事は出来ないのでしょうか。
よろしくお願い致します。

※下例のプログラムではcgi結果は表示されませんでした・・・。

---<index.htm>----------------------------------------
<HTML>
<BODY>
<SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT>
</BODY>
</HTML>

---<test.cgi>----------------------------------------
#!/usr/bin/perl

print "test"

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTML...続きを読む

Aベストアンサー

「Google AdSense」のjavascriptでは#1さんの回答にもありますがiframeを使用するような仕掛けになっているようです。
・javascriptでiframeを展開。
・iframeのsrcでcgiを指定。

>外部cgiでjavascriptを生成する仕組みを作り、その生成されたjavascriptを参照するという間接的な仕組みを設ければ可能になる
そういう仕組みも可能です。
また、直接的に<script type="text/javascript" src="xxxx.cgi"></script>
こういう書き方も可能です。
※xxxx.cgiでは処理結果をjavascriptのコードとして
print "Content-Type: application/x-javascript\n\n";
print "document.write('xxxx');";
みたいにして吐き出す必要があります。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Q