このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

IMGタグからCGIを起動させgifファイルを表示させるには?

発言者:よたろー
( Date Saturday, March 20, 1999 17:19:18 )


はじめまして、PERLの初心者です。
IMGタグでCGIを起動させ、HTMLのページ内にgifファイルを表示さ
せたいのですがうまく行きません。リンク切れのアイコンが表示
されてしまいます。

--giftest.html--
<HTML><BODY>
<IMG SRC="giftest.cgi">
</BODY></HTML>

--giftest.cgi--
#!/usr/local/bin/perl
$| = 1;
$image = "1.gif";
print "Content-type: image/gif\n\n";
open IMAGE,"$image" or die "オープン失敗\n";
binmode IMAGE;
binmode STDOUT;
while ($image = <IMAGE>){
  print STDOUT $image;
}
close IMAGE;
__END__

(「CGIのための実践入門PERL」中のプログラム
を若干変更したものです)
<META>タグで直接CGIへ飛ぶときはちゃんと表示され
ます。もちろん<IMG SRC="1.gif">でも大丈夫です。
MacにMacHTTP2.2.2サーバーをたてて、Netscape
からテストしています。(MacJPerl5.1.5r4を使用)
プロバイダのサーバーにアップしてテストしましたが
こちらもダメでした。ちなみに、他のCGIは問題なく
動いています。
2日間これで悩んでしまい先へ進めません。
どなたかご教授お願いします。

usui , seiichi さんからのコメント
( Monday, March 22, 1999 23:15:45 )

binmode IMAGE;
binmode STDOUT;

の2行を削除してください。


よたろー さんからのコメント
( Tuesday, March 23, 1999 13:55:47 )

usui , seiichiさん、コメントありがとうございます。
binmode行を削除してみましたがやはりダメでした。
一体何がいけないのか???。
ちょっと途方に暮れております。

よたろー さんからのコメント
( Tuesday, March 23, 1999 21:00:47 )

すみません、自己レスです。
Web共有コンパネをインストールしたら表示されるようになりました。
今まで一応サーバーとして動いていたのであまり気にしてなかったん
ですが、途端にサーバーが忙しく稼働し出しました。これが本来の姿
なのですね?(まだあまりよく判ってない)
また、プロバイダのサーバー上のCGIスクリプトが動作しなかったのは
改行コードがLFになってなかったためのようです(^^;;;
usui , seiichiさん始め、皆様おさわがせしました。

じゅん さんからのコメント
( Tuesday, October 19, 1999 17:36:34 )

はじめまして
私は、IMGタグからCGIを起動させgifファイルを表示させて
カウンタをMacJPerlで作ろうとしていますが、うまくいきません。
ブラウザでアクセスすると、6桁のカウンタなのですが、
一番左の桁(10万の位の桁)が表示されず、また、カウントが
増えていきません。
ソース等は下記の通りです。


-- index.html --
<html>
<head><title>sample</title></head>
<body>
<center>
<img src="./cgi-bin/count1.cgi" ALT="1" border="0" WIDTH="14" HEIGHT="20"
><img src="./cgi-bin/count2.cgi" ALT="2" border="0" WIDTH="14" HEIGHT="20"
><img src="./cgi-bin/count3.cgi" ALT="3" border="0" WIDTH="14" HEIGHT="20"
><img src="./cgi-bin/count4.cgi" ALT="4" border="0" WIDTH="14" HEIGHT="20"
><img src="./cgi-bin/count5.cgi" ALT="5" border="0" WIDTH="14" HEIGHT="20"
><img src="./cgi-bin/count6.cgi" ALT="6" border="0" WIDTH="14" HEIGHT="20">
</center>
</html>


-- count1.cgi --
#!perl

$countfile=":dat:count.dat";
$gif_0=":img:img0.gif";
$gif_1=":img:img1.gif";
$gif_2=":img:img2.gif";
$gif_3=":img:img3.gif";
$gif_4=":img:img4.gif";
$gif_5=":img:img5.gif";
$gif_6=":img:img6.gif";
$gif_7=":img:img7.gif";
$gif_8=":img:img8.gif";
$gif_9=":img:img9.gif";

$lockfile = ':lock:count.loc';

sub file_lock {
  local ($retry) = 0;
  LOCKCH:
    while ($retry <= 5){
      if (open LOCK,">>$lockfile") {flock(LOCK,2); last LOCKCH;}
      else {$retry++; sleep(1);} 
    }
}

&file_lock;
open(FT,"<$countfile");
$cnt=<FT>;
close(FT);

chop($cnt);
($cnt_a,$cnt_b)=split(/^0/,$cnt);
if($cnt_b eq 999999){$cnt_b = "0"}
$cnt_b++;

@cnt_t=split(//,$cnt_b);
while ($#cnt_t + 1 < 6){
  @cnt_t = (0,@cnt_t);
}
$cnt_0 = "0";
($cnt_1,$cnt_2,$cnt_3,$cnt_4,$cnt_5,$cnt_6) = @cnt_t;
$cnt_all = $cnt_0.$cnt_1.$cnt_2.$cnt_3.$cnt_4.$cnt_5.$cnt_6;

open(FT,">$countfile");
print FT "$cnt_all\n";
close(FT);

flock(LOCK,8);
unlink($lockfile);

chop($cnt);
@cnt_t=split(//,$cnt);
if($cnt_1 == 0) {$img = $gif_0};
if($cnt_1 == 1) {$img = $gif_1};
if($cnt_1 == 2) {$img = $gif_2};
if($cnt_1 == 3) {$img = $gif_3};
if($cnt_1 == 4) {$img = $gif_4};
if($cnt_1 == 5) {$img = $gif_5};
if($cnt_1 == 6) {$img = $gif_6};
if($cnt_1 == 7) {$img = $gif_7};
if($cnt_1 == 8) {$img = $gif_8};
if($cnt_1 == 9) {$img = $gif_9};

open(GIF,"<$img");
@gifdata = stat($img);
$byte = $gifdata[7];
print "Content-type: image/gif\n";
print "Content-length: $byte\n";
print "\n";
print <GIF>;
close(GIF);


-- count2〜6.cgi --
#!perl

$countfile=":dat:count.dat";
$gif_0=":img:img0.gif";
$gif_1=":img:img1.gif";
$gif_2=":img:img2.gif";
$gif_3=":img:img3.gif";
$gif_4=":img:img4.gif";
$gif_5=":img:img5.gif";
$gif_6=":img:img6.gif";
$gif_7=":img:img7.gif";
$gif_8=":img:img8.gif";
$gif_9=":img:img9.gif";

open(FT,"<$countfile");
$cnt=<FT>;
close(FT);

chop($cnt);
@cnt_t=split(//,$cnt);
if($cnt_t[2] == 0) {$img = $gif_0};
if($cnt_t[2] == 1) {$img = $gif_1};
if($cnt_t[2] == 2) {$img = $gif_2};
if($cnt_t[2] == 3) {$img = $gif_3};
if($cnt_t[2] == 4) {$img = $gif_4};
if($cnt_t[2] == 5) {$img = $gif_5};
if($cnt_t[2] == 6) {$img = $gif_6};
if($cnt_t[2] == 7) {$img = $gif_7};
if($cnt_t[2] == 8) {$img = $gif_8};
if($cnt_t[2] == 9) {$img = $gif_9};

open(GIF,"<$img");
@gifdata = stat($img);
$byte = $gifdata[7];
print "Content-type: image/gif\n";
print "Content-length: $byte\n";
print "\n";
print <GIF>;
close(GIF);


以上がソースです。
ファイルの構成は、
  index.html
  cgi-binフォルダの中にcount1〜6.cgiと、imgフォルダと、
             datフォルダと、lockフォルダ
    imgフォルダの中にimg0〜9.gif
    datフォルダの中にcount.dat
です。
これは、フリーであったものです。
使用環境は、AppleShareIP6.2です。
非常に長い文章になってしまいましたが、何が悪いのか、
また、他にMacJPerlで簡単に作れるのか、どなたか教えて下さい。
よろしくお願いいたします。

why さんからのコメント
( Tuesday, October 19, 1999 21:13:42 )

ここは、Applescriptでなくても大丈夫ですか?

田中求之 さんからのコメント
( Tuesday, October 19, 1999 22:18:45 )

もちろん、Perl だろうが、なんだろうが、遠慮なくどうぞ。

Perl については、私はわかりませんので、コメントできませんが。

usui , seiichi さんからのコメント
( Thursday, October 21, 1999 02:04:57 )

次の3行をコメントアウトしてください。

&file_lock;
flock(LOCK,8);
unlink($lockfile)

いろいろと勉強されているようですね。
不具合の修正方法(デバッグかな)はご自分で考えてみてください。

私はMacPerl / MacJPerlを使ったCGIはお勧めしませんが、
MacJPerlでも同様のもは簡単に作れますよ。

じゅん さんからのコメント
( Friday, October 22, 1999 11:56:11 )

返答遅れました。
正常に動きました。
ありがとうございます。
でも、この組み方ってやっぱり面倒な方法なのでしょうか?