CGIでHTMLファイルを読み込む方法とは?

このQ&Aのポイント
  • CGIを使用してHTMLファイルを読み込む方法について試してみましたが、うまくいきません。
  • ファイルの読み込みがうまくいかない場合、コードに誤りがある可能性があります。
  • ファイルパスやファイル名を正しく指定し、ファイルを開くコマンドを正確に記述することが重要です。
回答を見る
  • ベストアンサー

cgiでhtmlファイルを読み込みたい

cgiでhtmlファイルを読み込み、状況に応じてcgiで内容の修正や追加をして表示させたいのですがどうしても元ファイルを読み込めません。 IN = "○○.html"; $line = open(IN, "r"); とか $line = opne IN, "○○.html"; それに $line = "○○.html"; open(IN, $line); @line = <IN>; など調べて出てきたもの一通りやってみたのですが、どうしても読み込みができません。 どうすればファイルの読み込みができるのでしょうか。 仕事でどうしてもやらなければならないので、ご存じの方お助けください。

  • choei
  • お礼率63% (286/451)
  • CGI
  • 回答数6
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.5

openはCGIが実行されているOSが管理しているファイルを開くためのものです。ファイルの相対パスか絶対パスを指定します。URLではありません。 http://○○.com/index.html等のURLのファイルを取得するには、HTTP等のネットワーク通信を経由してファイルを取得することになります。openとはまったく別の仕組みになります。 >将来的には同一サーバー・同一ドメイン >今のところ、サーバーが全く別のところにあります。 前述の通り、openとHTTPは全く別物です。処理の負荷も全く違います。将来的にはopenを使う事になると思います(処理の負荷、速度を考慮して)。 その「将来」が近い将来なら、別サーバのファイルをCGIと同じサーバにコピーして、openを使って処理するCGIを作った方が良いと思います。今、HTTPを利用するCGIを作っても無駄になる可能性があります。 HTTPを利用する場合、openよりもかなり複雑なプログラムになります。(LWPなどのモジュールが利用できる場合は簡単で、数行のコードで済みますが・・・) LWPなどのモジュールが利用できる場合 #!/usr/local/bin/perl use LWP::Simple; $url = "http://○○.com/index.html"; $content = get($url); print $content; モジュールが利用出来ない場合は、ここで説明するのは面倒なので、 http://ash.jp/perl/socket_http.htm こちらのサイトなど参考にして下さい。 >ただ、テストで同一サーバーでもやってみましたがうまくいきません。 $filename の内容は? http://~ は使えませんよ。 CGIの有るディレクトリからの相対パスで指定してみてください。

choei
質問者

補足

ありがとうございます。 LWPのモジュールが使えたので、教えていただいた数行のコードで読み込みできました。 そのまま画面表示のテストをしてみましたが、そのhtmlファイルに直接記述してあるものは全部読めました・・・が、cssやimageファイルは全く読み込んでくれません。 これはこれで仕方のないことなのでしょうか。 IEで表示したファイルのソースを見る限りでは直接開いたものと何ら変わりないようなのですが・・・ ここにも何かルールがあるのでしょうか。 お手間おかけしますがあともう少しだけアドバイスください。 よろしくお願いします。

その他の回答 (5)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.6

>そのhtmlファイルに直接記述してあるものは全部読めました・・・が、cssやimageファイルは全く読み込んでくれません。 HTMLの基礎的な内容だと思いますが・・・(^^; HTML内に相対アドレスで指定されているファイルは当然そのままでは開けません。絶対アドレスに書き換えるか、参照している全てのファイルをCGI側のサーバにコピーするかどちらかです。 >お手間おかけしますがあともう少しだけアドバイスください。 私の分かる範囲でしたら、時間の許す限り何でもお答えしますが、先行きが怪しくなってきたので一度整理させて下さい。あと少しでは済まない感じがしますよ(^^; >cgiでhtmlファイルを読み込みたい 最初の質問は解決しました。別サーバのhtmlファイルを読み込むことは出来ました。 で、それを使って最終的に「何がしたいのか?」が分かりません。 現在htmlが有るサーバ:サーバAとします。 現在CGIが有るサーバ:サーバBとします。 サーバAはインターネット上に公開済みですよね? サーバBもインターネット上に構築中でしょうか?それともローカルでテスト中でしょうか? サーバBのCGIでサーバAのhtmlファイルを読み込んで、一部を修正して、その先は? ひょっとしてサーバAのサイトを丸ごとサーバB上に再現しようと言う計画でしょうか?

choei
質問者

お礼

勘違いしておりました。 そりゃそうですよね。開けるはずがない。 コンピュータが行う作業の順番が完全に勘違いして初歩的なことを聞いてしまいました。(元ファイルが先にリンク先にデータを読みに行って、全て引き連れて今回の処理にやってくる・・・なんて訳の分からない勘違いしてました) お恥ずかしい限りです。 ということで全て解決しました。 結局今回やりたかったのは自社運営しているショッピングサイトの拡張に関わることだったんです。 商品ジャンルを増やすということで、現在のショッピングサイトのデザインイメージにそぐわないものが加わる。。。 元は元でそれなりに機能しているから残して、新サイトを立ち上げて、でもでもそこでも今の商品も混ぜて売ろうと・・・ なので一部は元のhtmlファイルを流用しようと・・・ 1つのおっきな容量のサーバーを借りて統合すればこんなことしなくてもすんだのでしょうが、複数のドメインなどを取るタイミングでその時々で安いところを選んだ結果サーバーがバラバラになってしまいました。 素人質問に丁寧にお答えいただきありがとうございました。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

>ちなみにindex.htmlのところはhttp://○○.com/index.htmlと変えてます。 これはダメですよ。 同じサーバのファイルなら、httpではなく、ファイルのパスを指定します。 別のサーバのファイルなら、openでは開けません。 別の手段で取得可能です。 同じサーバのファイルか、別のサーバのファイルか補足願います。

choei
質問者

補足

将来的には同一サーバー・同一ドメイン(サブドメインで分けて同じメインドメインで統一予定)を予定していますが、今のところサーバーの契約条件など諸条件もあり、サーバーが全く別のところにあります。 ドメインも基本的に関係ない(所有者は同じですが)ドメインです。 つまりは今回の件では全く別サーバーのファイルになります。 ただ、テストで同一サーバーでもやってみましたがうまくいきません。 アドバイスよろしくお願いします。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

#2です。念のため修正します。 >print "File Open Error"; print "<html><body>File Open Error</body></html>"; タグ入れるの忘れてました。

choei
質問者

補足

普通に問題なく表示しました・・・

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

文法的な問題ではないように思います。 まず、CGIは実行されてますか? ファイルのパーミッションや、1行目のperlのパスは問題ないですか? 下記のスクリプトの実行結果はどうなりますか? #!/usr/local/bin/perl $filename = "index.html"; if(open(IN,$filename)){ @lines = <IN>; close(IN); print "Content-Type: text/html\n"; print "\n"; print @lines; }else{ print "Content-Type: text/html\n"; print "\n"; print "File Open Error"; } exit;

choei
質問者

補足

cgiは実行されてます。 正常に稼働しているcgiファイルと同じフォルダに置き、属性は707で、1行目などのPerlのパスも元々正常稼働しているファイルをコピペしてますので、間違いないと思います。 教えていただいたスクリプトを実行したところ File Open Error とでました。 ちなみにindex.htmlのところはhttp://○○.com/index.htmlと変えてます。 スクリプト自体はエラーが出ないのですが、標準入力でデータが取得できません。 perlの構文やパーミッションなどcgiファイルそのものとは全く別のところに問題でもあるのでしょうか。

noname#39970
noname#39970
回答No.1

CGIって サーバが返す仕掛けの事を言ってるだけで言語の事を指してるわけじゃない 何を使ってるのか判らないので答えようが無いんだけど? http://www.google.co.jp/search?q=perl%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&hl=ja&lr=lang_ja

choei
質問者

補足

明記するの忘れてました。 言語はperlです。

関連するQ&A

  • 一番大きいファイルを探し出すCGI…が動かない!

    ホームページ作成中です。 以前ここで「あるフォルダ内に連番のhtmlファイルが自動作成され(1.html,2.html~~)、その中で一番数が大きいファイルを表示するCGI」というのを質問させていただきました。 その後すぐ回答が来て、なんとCGIを作っていただいたんです。で、試しに使ってみると(5~6枚くらい)、無事新しい方(数が多い方)を読み込んでくれていたので、感謝の気持ちと共に質問を解決させていただきました。 しかし、後になって問題が発生しました。 桁が上がると、新しい物を表示してくれないのです。 9.html,10.htmlがあると、9htmlの方を表示してしまうんです。 ソースは以下の通りですが、どこを変えることで2桁、3桁と対応可能でしょうか?自動生成するCGIに0001.htmlというように吐き出させればいいのかもしれませんが、そうする技術も無いので… よろしくお願いします。 ------------------------------------- #!/usr/bin/perl $DIR = "./se3_diary/"; $new = 0; opendir(DIR,$DIR); while ( $file = readdir(DIR) ) { if ( $file =~ /^(\d)+\.html$/ ) { $new = $1 if ( $new < $1 ); } } closedir(DIR); open(IN,"$DIR$new.html"); $src = join("",<IN>); close(IN); print "Content-Type: text/html\n\n"; print $src; exit();

    • ベストアンサー
    • CGI
  • cgiでのファイルオープン

    cgiでファイルをオープンする時 open IN,"$file" でオープンしているのですが この時、$file に他のサーバー下のファイルを指定すると エラーになってしまうんですか? 管理しているサーバーが2つあり、他方のサーバーからファイルを 読み込んで処理をしたいのですが、どうしたらいいのでしょうか? 読み込むだけで、書き込むことはしません。 お知恵を貸してください。 よろしくお願いします。

    • 締切済み
    • CGI
  • CGIでファイルのダウンロードをさせたい

    ホームページでファイルのダウンロードをさせたいの ですが、セキュリティの関係もあって元ネタのファイル はURLで指定できるところにはありません。 そこで、C言語でCGIを作成し、Content-Type: text/plain\n\n などとし、CGI側でファイルをOPEN して吐き出させたところ、ブラウザー(IE5)では ダウンロード画面が表示されず。CGIが出力した内容が そのまま表示されてしまいます。CGIでの処理が足りない と思われますが、どうしたらCGIからブラウザーへダウンロードの指示を出すことができるのか教えて下さい。

    • 締切済み
    • CGI
  • 画像ファイルの別名保存(CGI)

    サーバーに既にある画像ファイル(test.gif)を別名に変えて保存するCGIを作ろうとしています(ただのリネームではなく、結果的に元の画像ファイルと名前を変更した画像ファイルの2つがサーバーに残るようにしたいです)。 ファイルハンドルによる関連付けで、test.gifを一度@aaa配列として読み込み、その@aaa配列を使って「bbb.gif」に書き出すという文を書いて見ましたが、生成されるファイルは画像ファイルとして表示してくれずにエラーとなってしまいます。 どなたか解決方法がわかる方アドバイスをお願いしますm(_ _)m 以下ソースです。 --------- open (IN,"test.gif"); @aaa = <IN>; close (IN); open (OUT,"> bbb.gif"); print OUT @aaa; close (OUT); ------ ↑はgifファイルではなくtxtファイルだと上手く行きます。 参考にしたサイトは↓です。 http://www.aimix.jp/cgi/syohofileread.html http://www.aimix.jp/cgi/syohofilewrite.html よろしくお願いしますm(_ _)m

    • 締切済み
    • CGI
  • 下の階層のディレクトリーにファイルを作るには?

    はじめまして。 最近、perlの勉強をはじめたばかりの初心者です。 初歩的なことだと思うのですが、分からないことがあったので教えて頂ければ幸いです。 メールアドレスを認証するためのCGIを作っています。 下記は$passwd.htmlという名前のファイルを作って、soudan.htmlの内容を書き込んで保存する部分のスクリプトです。 #乱数htmlを読み込む open(IN,">$passwd.html"); #相談htmlを読み込む open(HTML,"soudan.html"); while($line=<HTML>){ print IN $line }; #乱数htmlを閉じる close(IN); 実行してみるとcgiとおなじファイルに「$passwd.html」ができました。 cgiのあるディレクトリの下の階層にファイルを作りたいと思っていろいろ調べてみたのですが、どのようにしたらいいのかよく分かりませんでした。 cgiのあるディレクトリより下の階層にファイルを作るにはどうしたらいいのでしょうか? 詳しい方、教えて頂ければ幸いです。 あと、こちらのサイトも役立つと思うのですが、oerlのプログラミングで困ったときに相談できる掲示板やサイトなどがありましたら教えてください。

    • ベストアンサー
    • Perl
  • 画像とtxtファイルの表示

    現在CGIでtxtファイルが表示されるように print "Content-type: text/html; charset=euc-jp\n\n"; $count = 0; $viewline = 1; open(IN, "A.txt"); while(<IN>){ if($count == ( $viewline - 1)){ $line = $_; last; } $count++; } close(IN); print "$line\n"; としています。 ここでさらに画像も一緒にCGIで表示させたいのですが、そうゆうことはできるのでしょうか? できるのであれば教えて頂きたいです。調べてみたのですがなかなか見つからなくて・・・。 よろしくお願いします。

    • 締切済み
    • CGI
  • CGIが吐き出したファイルの所有者の変更

    データベースCGIで作ったデータを元にhtmlファイルを吐き出すようなつくりにしています。 この、吐き出されたファイルの所有者がnobodyになっていて、FFFTPなどのソフトから修正しようとすると上書きが出来ない状態になってしまっています。 これを、CGIから吐き出す時に所有者を変える事は出来ないのでしょうか? 吐き出すところは以下のようになっています。 sub html_reg{ if (-e "../../list/$no.html"){unlink "../../list/$no.html";} open(HTML,"+>>../../list/$no.html"); &html_data; close(HTML); }

    • 締切済み
    • CGI
  • cgiファイルのhtmlファイルへの組み込みについて

    htmlファイルの中にcgiファイルの実行内容を組み込むことはできるでしょうか?できるとすればhtmlファイルにcgiファイルをどのように記載したらよいのか教えて下さい。 <例> ◎http://www.test.cgi(cgiファイル) print<<"EOT"; cgiで作ったファイル<br> htmlに組み込む EOT ◎http://www.test.html(htmlファイル) <html> <body> ここにcgiファイルの実行内容を表示させる </body> </html>

    • ベストアンサー
    • CGI
  • CGIのログをHTMLで表示

    CGIのログ(カウント)をHTMLにSSIで表示させようと思い下記のCGIを考えたのですがうまく表示されません。 皆様のお力をお貸し下さい! [log.dat] L内容 DataSu='***'; (***にはカウント数字が入っています) 上のカウントログをHTML表示させる為にCGIを作る [count.cgi] #!/usr/local/bin/perl #カウントログ読み込み open(IN,"ログまでの相対パス"); # カウンターを読み出す $count = <IN>; #ファイルを閉じる close(IN); #サイト数の表示。 print "Content-type: text/html\n\n"; print "$count"; 上記のCGIを表示させるとDataSu='***';とファイル内容が全て表示されてしまいます。 ***のカウント数だけ表示させるにはどうしたらいいのでしょうか?

    • 締切済み
    • CGI
  • CGIにおけるサーバへのファイル書込みについて

    [Mon Oct 16 16:27:12 2006] [error] [client 207.46.98.48] Premature end of script headers: prev.cgi [Mon Oct 16 16:27:13 2006] [error] [client 66.249.72.6] damy.dat Cannot Open at /home/e-fresh/public_html/prev.cgi line 71. サーバに上記のようなエラーログがありまして, ファイル作成&書込みができません。 私自身としては,サーバのフォルダに書込み権限が無い事が考えられます が,それをチェックする方法があれば併せてご教示願います。 prev.cgiの中身は下記の通りです。 $damy = 'damy.dat'; open DB,"$d_file" or die "$d_file オープン失敗"; open DAMY,">$damy" or die "$damy Cannot Open"; while (<DB>){            …} close DAMY; close DB; #ダミーファイルをデータファイルにリネーム rename($damy, $d_file) or die "Could not RENAME $damy TO $d_file";

専門家に質問してみよう