• 締切済み

cgiでデータのDL直後にメッセージを出したいのですが

自宅サーバーを運用していて、つまづいております… 私のサーバーでは、データへはURLでは直接アクセスさせないで、cgiの中で 文字列を置換して、HDDの中のフォルダ名/ファイル名を指定して、DL させるようにしています。 (事情があり、この方法にしております) そこで、DL時のダイアログを表示させる為に、以下のような2つのcgiを 作成して、cgi_aの"DLボタン画像"を左クリックすると、cgi_bへジャンプ して、実データをクライアントのPCに保存出来るようになっております。 ここで、DL後にメッセージを表示させるようにしたいのですが、 cgi_bで『Content-type: application/download』としてしまっている為に メッセージを表示させたくても、html記述が出来ずに困っております。 『Content-type: application/download』の後に、 『Content-type: text/html』に戻せるような方法や、その他html記述が 出来るような解決方法をご存知のかたがいらっしゃいましたら、よろしく お願いします。 <元のcgi(cgi_aと命名)> print "Content-type: text/html\n\n"; print <<"---HTML---"; <html><head><title></title></head> <div align="center"> <form action="ジャンプ先のcgi" method="POST" name="entry"> <tr> <input type="hidden" 渡すパラメータの記述が数個 > <td><input type="image" src="DLボタン画像.gif" value="submit" onclick="this.entry.submit(); return false;" /></td><BR> <BR> <ジャンプ先のcgi(cgi_bと命名)> print "Content-type: application/download\n"; print "Content-Disposition: attachment; filename=$filename\n\n"; binmode(STDOUT); open(DATA,"$value") ; binmode(DATA); print <DATA>; close(DATA);

  • CGI
  • 回答数2
  • ありがとう数18

みんなの回答

  • pick52
  • ベストアンサー率35% (166/466)
回答No.2

いろいろやってみたのですがどうやらファイルのダウンロードをすると onloadは効かないようですね。 なので、どうしてもダウンロードを待ってページの推移を行うって できそうにないのですが...。 力不足ですみません。 > ネット回線の速度を測定するHPでは、データをDL後に次の処理に進まないと、速度を表示出来ないのだと思いますけど、そのページのように > 完全にDLが終わってから、メッセージを表示させたいと思っております。 その用途だと回線速度を計測するためだけにファイルをDLしたいと いうことでしょうか。 ファイルを実際にローカルに保存する必要がないようならAjaxを 使用すればできそうな気がしますがあいにくAjaxはよく分からないので サンプルを作れません。

kaduno
質問者

お礼

こんにちは、 >力不足ですみません。 いえ、ありがとうございます。 >回線速度を計測するためだけにファイルをDLしたいということでしょうか。 説明がヘタですいません。 DLが完全に終わってから、次の処理へ  という意味を強調したかっただけでして。 ホント、いろいろ試して戴いて有り難うございました。

  • pick52
  • ベストアンサー率35% (166/466)
回答No.1

普通にはできないのでこんな感じでフレームを使用して無理矢理実現 するのはどうでしょうか。 use strict; use CGI::Carp qw(fatalsToBrowser); my $cgi = &getreq(); # リクエストにより処理を分岐する if($cgi->{'mode'} eq 'main') { &main(); } elsif($cgi->{'mode'} eq 'dl') { &dl('test.cgi'); } elsif($cgi->{'mode'} eq 'comp') { &comp(); } # フレーム表示 &header('テスト', 1); print <<"HTML"; <frameset rows="100%,0%"> <frame src="./test.cgi?mode=main" frameborder="0" name="main" noresize> <frame src="about:blank" frameborder="0" name="hide" noresize> </frameset> HTML &footer(); exit; # CGI リクエスト取得 sub getreq { # 環境変数取得 my $cgi = {}; my $query = ''; read(STDIN, $query, $ENV{'CONTENT_LENGTH'}) if($ENV{'CONTENT_LENGTH'}); $query = join('&', $query, $ENV{'QUERY_STRING'}); # デコード my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%(\w{2})/pack('C', hex($1))/eg; $val =~ s/(\x0d0a|\x0a|\x0d)+$//; $name =~ tr/+/ /; $name =~ s/%(\w{2})/pack('C', hex($1))/eg; $name =~ s/(\x0d0a|\x0a|\x0d)+$//; if(exists($cgi->{$name})) { $cgi->{$name} = [(ref($cgi->{$name}) eq 'ARRAY' ? @{$cgi->{$name}} : $cgi->{$name}), $val]; } else { $cgi->{$name} = $val; } } delete($cgi->{''}); return $cgi; } # HTTP ヘッダと HTML ヘッダ sub header { my $title = shift; my $body = shift; print "Content-type: text/html; charset=shift_jis\n\n"; print <<"HTML"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis"> <title>$title</title> </head> HTML print "<body>\n" unless($body); return; } # HTML フッタ sub footer { print "</body>\n</html>\n"; exit; } # メインページ sub main { &header('テスト'); print <<"HTML"; <form action="test.cgi" method="post" name="entry"> <input type="button" value="submit" onclick="top.hide.location.href='test.cgi?mode=dl';location.href='test.cgi?mode=comp';"> </form> HTML &footer(); } # ファイル DL sub dl { my $fn = shift; print "Content-disposition: attachment; filename=$fn\n"; print "Content-type: application/octet-stream\n\n"; if(open(FILE, '<test.cgi')) { print <FILE>; close FILE; } exit; } # コンプリート画面 sub comp { &header('DL 完了!!'); print "<div>ダウンロード完了!!</div>\n"; &footer(); } 1; これだとフレームに非対応なブラウザなどで正常に動作しませんが。 (実際には<noframes>を忘れないようにしてください)

kaduno
質問者

お礼

こんにちは。 『CGI リクエスト取得』『デコード』など、私のレベルでは難しくて分からないところもありますが、それでも『ファイル DL』のサブルーチンで ファイル名を設定してDL出来るまでにはなりました。 このプログラムは、メインページで『test.cgi』に『mode=dl』と『mode=comp』と同時に送っているのですよね。 この同時というものが厄介でして、ちょっと大きめのデータをDLしようとしたところ、DL完了前に『ダウンロード完了』のメッセージが出て しまいました。 ネット回線の速度を測定するHPでは、データをDL後に次の処理に進まないと、速度を表示出来ないのだと思いますけど、そのページのように 完全にDLが終わってから、メッセージを表示させたいと思っております。

関連するQ&A

  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI
  • CGIへ飛ばずに処理だけさせたい

    HTMLのフォームからsubmitしてcgiにアクセスする。 cgiでHTMLからのポストとゲットを読み込んで ログファイルに書き込む。 というCGIを作ったんだけど、 print "Content-type: text/html\n\n"; を書かないと、submitしてからcgiの処理が 止まらないみたいでした。 print "Content-type: text/html\n\n"; を書くと、処理は正常になるけど、cgiファイルに ジャンプしてしまいます。 openで書き込みをする場合、cgiに飛ばずに 処理する方法を教えてください。

    • ベストアンサー
    • CGI
  • CGIで二つの仕事をしたい

    464487で質問したOtanoshikeです。 メール送信CGIは_mer_さんに教えて頂いたように直したら、無事動くようになりました。 今度は、このCGIの中で、メール送信後にファイル転送をしようとしています。 一応動いてはいるようなのですが、最後の確認ページが出ません。 どこが悪いのでしょうか?恐らくはまた基本的なことを無視しているのでしょうね。 よろしくお願いいたします。 (a.cgi) #!/usr/bin/perl require '../mimew.pl'; require '../jcode.pl'; $sendmail = "/var/qmail/bin/sendmail"; $master_id = "ho\@hoge.net"; $msg="メッセージ"; &jcode'convert(*msg,'jis'); open (ML,"| $sendmail $master_id"); print ML $msg; close(ML); $filename=$ARGV[0]; $file="/~/~/$filename"; $filetype='x-exe'; print "Content-Disposition:attachment;filename=\"$filename\"\n"; print "Content-type:application/$filetype\n\n"; open(FILE,"$file"); while(<FILE>){ print "$_"; } close FILE; print "Content-type: text/html\n\n"; print "<html><head>\n"; print "</head>\n"; print "<body>sent.\n"; print "</body></html>\n"; exit;

    • ベストアンサー
    • CGI
  • CGI経由PDFダウンロードでエラー

    CGIの知識が全くなく、いろいろなサイトを参考にさせていただいています。 表現等が正しくないことがあるかもしれませんが、ご了承下さい。 htmlのsubmitからcgiを経由してpdfをダウンロードさせるように作成中です。 cgiは、下記Uページを参考にさせていただきました。 http://www.abe-tatsuya.com/web_prog/perl_cgi/content_disposition.php #実際の記述<----------------------------------------------- #-- ダウンロードさせる元ファイル $source = 'doc.pdf'; #-- 保存時のファイル名(デフォルト) $filename = '申込書.pdf'; #-- HTTPヘッダ送信 print qq|Content-type: application/pdf\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); while(<FILE>){print;} close(FILE); #---------------------------------------------------------> 上記の結果、ダウンロードはできるのですが、 Acrobatのエラーで、「この文章を開くときにエラーが発生しました。ファイルが壊れています。修復できませんでした。」 というメッセージが表示されます。 PCを変えてみたりもしましたが、どのPCからダウンロードしても同じです。 ちなみに、ウェブサーバーへアップロードする前のpdfは、ちゃんと開きます。 何が原因なのでしょうか?

    • 締切済み
    • CGI
  • cgiでメタタグを使用するにはどうすればいいですか

    htmlでメタタグ <meta http-equiv="refresh" content="4;URL=#.html"> と、4秒でURLにジャンプしています(URLは略)。 cgiサイトもあり、cgiでも、4秒でURLにジャンプしたいです。 print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<meta http-equiv="refresh" content="4;URL=#.html">\n"; print "</head>\n"; print "</html>\n"; print "と\n";で単純に挟んでいますが、エラーになってしまいました。 メタタグには、特殊な書き方があるのでしょうか?

    • ベストアンサー
    • CGI
  • HTMLのファイルにCGI処理結果を表示する

    まずトップページはhtmlで作ります。 そのトップページにいつも変化する所があるのでcgiで処理を施したものをhtmlに貼り付けたいと思っています。 その場合に例えば画像を出力させる場合は <IMG src="cgi-local/top.cgi"> で指定し、 #!/usr/local/bin/perl print "Content-type: image/jpeg\n\n"; open FH,"<../image.jpg"; binmode FH; binmode STDOUT; print while(<FH>); close FH; をやれば動かせますが、これを画像ではなくhtmlを表示させるためには print "Content-type: image/jpeg\n\n"; を print "Content-type: text/html\n\n"; に変更する事により可能だと思いやってみたのですが、うまく出力できませんでした。 cgi処理をうまくhtmlに貼り付ける方法があるのでしょうか。どうか教えて頂けないでしょうか?お願します。(涙)

    • ベストアンサー
    • CGI
  • はじめまして

    はじめまして 現在、PerlのMVCフレームワークCatalystのperlソースコード内で ボタンを押すと、ユーザーにとあるファイルをダウンロードさせたい と考え、以下のように実装しました my $filedir = '/var/www/html/Catal/lib/Catal/Controller/'; my $filename = 'test.zip'; my $filepath = $filedir . $filename; print "Content-type:application/download; name=\"$filename\"\n"; print "Content-Disposition: attachment; filename=\"hogehoge\"\n\n"; open(FILE,"< $filepath"); binmode FILE; binmode STDOUT; print while(<FILE>); close(FILE); 上記コードを動かすとIEのページにZIPファイルがバイナリ表示されるだけで ダウンロードダイアログすら出ません。 どうしたら、ダイアログを表示させ、ユーザーが望む場所にダウンロード させることができるでしょうか。 よろしくお願いします。

  • CSVダウンロードについて

    IIS/perl/oracle お世話になります。 社内の業務ホームページにて、データをダウンロードできるシステムの改造を行っています。 本番環境とテスト環境があり、ほぼ同じような環境にして あります。 なのに、本番環境ではちゃんと”ファイルをダウンロード”という ダイヤログが表示されるのに、同じモジュールをテスト環境にもってくるとダイヤログが出ずに CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers. と出ます。perlの-wcオプションをつけてのデバッグでsyntaxはOKと出るし、本番環境で動くことから、スクリプト自体に問題はないと思っているのですが、環境面で何か設定しなくてはいけないことがあるのでしょうか? 念のためスクリプトを載せます。 binmode(STDOUT); print "Content-Type: application/octet-stream; name=\"$fname\"\n"; print "Content-disposition: attachment; filename=\"$fname\"\n"; print "Content-length: $size\n"; print "\n"; (1) print $CSV; close(STDOUT); どうも(1)あたりでこけてるようなのですが・・・。(少なくともbinmode手前まではprintを差し込んで動いているのを確認できています) IISの設定等、あまり詳しくはないので、初心者向けに 教えていただくと助かります。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGIにJAVAの記述をしたい

    CGIプログラムの中にJAVAの記述をしたいのですが うまくいきません。 ヒアドキュメントでくくってみましたが 500エラーで表示されませんでした。 どう記述すれば動いてくれるんでしょうか? print "Content-type: text/html\n\n"; print "<html><head>\n"; print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n"; print "<link rel=\"stylesheet\" type=\"text/css\" href=\"$loaddir/style.css\">\n"; print "<title>$title</title>\n"; ここに下記のJAVA文を入れたいです。 print "</head>\n"; 記入したいJAVA <SCRIPT language="JavaScript"> <!-- document.write('<img src="momo/123.cgi?' + 'javaref=' + document.referrer + '" width=1 height=1>'); // --> </SCRIPT>

    • 締切済み
    • CGI
  • iis+cgiでmultipart/form-data送信がうまくいかない

    これまでLinux+Perl/CGIで構築していたWEBサーバをIIS+Perl/CGIに移す必要が生じ、新規にIISによるWEBサーバを構築しました。 一気にコンテンツを移動してもハマるだけだと考え、まずは簡単なコードを記述しCGIが動作するかどうかテストしています。 POSTによるinput type=textのデータ表示まではうまく行きましたが、ファイルアップロードのところで詰まりました。 IIS(Windows)によるWEBサーバの構築は初めてで、何が問題なのかサッパリわかりません。 どなたか問題点あるいはどこをチェックすれば良いかご指摘いただけませんでしょうか。 ●やった事 PerlにてPOSTを利用しmultipart/form-dataにてファイルをアップロードするシンプルなコードを書き、第一段階としてMIMEエンコードされたものをブラウザ上に表示するしようとしてみた。 コードは最下方の通り。 ●症状 送信を実行してもアップロード中のまま(ウィンドウマークが動き続けている)で、IISに設定してある10分程のタイムアウト時間を過ぎて終了してしまう。 TXT、XLS、DOCなどファイル種を変えて試しても全く同じ症状。 ●環境:Windows2000ServerSP4 IIS5.0 Perl5.8.8 *******アップロード画面****** <HTML> <HEAD> <TITILE>ファイルのアップロード</TITLE> </HEAD> <BODY> <FORM ACTION="/cgi-bin/upload.cgi" ENCTYPE="multipart/form-data" METHOD="POST"> ファイル: <INPUT TYPE="file" NAME="File" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> </BODY> </HTML> **********ここまで*********** *******CGI******************* #!/perl/bin/perl read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); print "Content-type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>test</TITLE>\n"; print "</HEAD>\n"; print "<BODY BGCOLOR=\"#ffffff\">\n"; print "$buffer"; print "</BODY>\n"; print "</HTML>\n"; exit; ********ここまで***********************

    • ベストアンサー
    • CGI