• 締切済み

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
  • 回答数1
  • ありがとう数5

みんなの回答

回答No.1

テストしてないので、漏れてるかもしれないけど、 気になったことだけ・・・・ 1) Content-type: text/plain ↓ Content-type:application/pdf 2) Content-Disposition: attachment; filename="$filename" の$filenameはパス('./data/')を含まない、ファイル名('sheet.pdf')のみに。 3) open(FILE,$source); をヘッダを printしている前にもってきて open(FILE,$source) or die("error :$!"); に変更。(ファイルの存在チェック)

take79vnjp
質問者

お礼

superside0さん。 問題を解決できました。ありがとうございました。

take79vnjp
質問者

補足

superside0さん。 早速ご回答して頂きありがとうございます。 指定の通りに直してみましたが、サーバーから"500 Internal Server Error”のエラーが表示されます。ファイルパーミッションを755を変更してみても変わらない。 open(FILE,$source) or die("error :$!"); をprintしている後に書くとダウンロードダイアローグが表示され、ダウンロードできますが、ファイルは0バイトです。 printしている前に書くと上記のエラーが出ます。

関連するQ&A

  • 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
  • 圧縮ファイルの取得

    http://okwave.jp/qa/q8823112.html こちらで質問させていただいたように、/public_html/file.zipではなく、/file.zipの ファイルをダウンロードさせるために以下の方法を取りました。 print "Content-type: application/x-tar\n\n"; open( FH, "$filename" ); binmode FH; binmode STDOUT; print <FH>; close( FH ); この方法では、ブラウザで表示させてダウンロードできるようになったのですが、 これをperlで、wgetか、何かを使って取得したいと考えています。 ところが、wgetで試したところ、zipファイルではなく、cgiページ自体のソースの取得になってしまいました。 zipファイルを取得するにはどのようにしたらよいのでしょうか。 perlの知識があまりないので、どうしても解決できません。 宜しければ具体的に書き方を教えていただけると大変助かります。どうぞよろしくお願いいたします。

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

    はじめまして 現在、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
  • バイナリファイルの出力

    「test.dat」というファイルをブラウザから ダウロードさせるためにバイナリ出力をしたいのですが、 空ファイルばかりできて上手くいきません。 以下のようなコードなのですが、どこが悪いでしょうか? ご教授ください。お願いします。 症状:ブラウザからダウンロードすると、ファイル名は正しいが 空のファイルになっている 環境:perl 5.8.7 windows server2003 ----------------------------------------------------------- #!/usr/local/bin/perl print "Content-Disposition: attachment; filename=\"test.dat\"\n"; print "Content-Type: application/octet-stream\n\n"; open(IN, "test.dat"); binmode(IN); binmode(STDOUT); print while (<IN>); close(IN); -----------------------------------------------------------

    • ベストアンサー
    • Perl
  • 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
  • CSVファイルのダウンロードについて

    現在開発しているシステムでCSVファイルをダウンロードしたいのですがうまくいきません。どなたか問題の解決できる方お願いします。 現在、CGIでCSVファイルを作成しておきそれをファイルのリンクからダウンロードさせようとしています。 そこで問題になっているのがIEのバージョンが6以前なら普通にダウンロードが出来るのですが、バージョン6だとEXSELがブラウザ内で立ち上がります。 これの回避方法(まずダウンロードをしたいです。)はありませんか? 現在ファイルのヘッダーはこのようにしています。 print "Content-type: application/octet-stream\n" ."Content-Disposition: attachment; filename=aaa.csv\n\n" あと、このCGIプログラムをネスケ、mozillaで開くとソースがブラウザに表示されてしまいます。IEでは問題なく表示されるのにネスケとmozillaはどうしてこんなことが起きるのでしょうか? 少しわかりずらい文章になってしまって申し訳ありません。 どなたかお力を貸してください。お願いします。

    • 締切済み
    • 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
  • 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
  • ファイルダウンロードのContent-type

    ファイルをアップロード/ダウンロードできるスクリプトを作って運用しています。 2年ほど運用して特に問題なかったのですが、今日、ユーザーからダウンロードできないと問い合わせがきました。 Conten-typeでアプリケーションをしっかりと指定していないことが原因かもしれないと思っているのですが、 どうでしょうか? 言語はPerlです。 アップされたファイルは、ダウンロード時に、頭に以下を付けて送信しています。 エクセルやpdf、ファイルの種類が何になるか分からないため、Content-typeには applicationと記入しています。これが問題でしょうか? ファイル毎に拡張子を見て、Content-typeを書き直すというのが普通なのでしょうか? print "Content-type: application\n"; print "Content-Disposition: attachment; filename=$in{'filename'}\n\n"; 現象 ファイルをダウンロードしようとすると、エラーメッセージを表示 「サーバーが見つからないかDSNエラーです」 ブラウザ:不明 OS:不明 セキュリティー関連ソフトの有無:不明 すみません、ユーザーにもっと詳細を聞くべきだとは思いますが、予めこちらで調べておいてからコンタクトとろうと思っています。