CGI-BBS > CGI > Perl > 文字に変換された画像とテキストを同じファイルに表示させたい。


カレッヂ
カレッヂ


質問者 えま  投稿日 2004/3/25(木) 01:33:30
こちらの『スタディーレスキュー』で紹介されている簡易BBS2にも使われているという画像を文字に変換するスクリプトについての質問です。

unpack.cgi では

#!/usr/local/bin/perl
@array = (
文字に変換されたデータ
);
print "Content-type: image/gif\n\n";
foreach (@array) {$data = pack('C*',hex($_));print $data;
}
exit;

となっていて、パックされた画像が表示されるのですが、このファイルに文字などを一緒に表示させる方法がわかりません。
ただ単に

print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>sample</title>\n";
print "</head>\n";
print "<body>\n";
print "※コメント\n";
print "</body>\n";
print "</html>\n";

といった文字列を足してみても上手くいかなかったので簡易BBS2のソースを見てみたのですが、複雑すぎてどうなっているのかよくわからなくて…。
どうやら

sub copyright {}

とか

sub html {}

といったもので括っているようなのですが、その部分を真似ただけではエラーになってしまいました。
簡易BBS2のように1つのcgiファイルに画像と文字を一緒に表示させるにはどうすればいいのか教えていただけないでしょうか。
よろしくお願いします。

プロバイダ参照:
サーバのOS:(未選択)
パソコンのOS:WinNT系
エディタ:
FTPソフト:FFFTP
サーバ移転:していない
改造:(未選択)
CGI習熟度:beginner

回答者 sim  [削除]  投稿日 2004/3/25(木) 13:06:54
簡易BBSと同じ仕組みで表示させるなら下記のようにすればよろしいかと思います。

#!/usr/bin/perl

if($ENV{'QUERY_STRING'}){&$ENV{'QUERY_STRING'};}

print "Content-type: text/html\n\n";
print "<html><head><title>Test</title></head>\n";
print "<body>\n";
print "Hellow!\n";
print "<hr>\n";
print "<img src='./this.cgi?Image'>\n";
print "</body></html>\n";
exit;

sub Image {
 @array = ("画像");
 print "Content-type: image/gif\n\n";
 foreach (@array) {
  $data = pack('H2',$_);
  print $data;
 }
exit;
}

質問者 えま  [削除]  投稿日 2004/3/25(木) 23:19:18
simさま、質問に答えてくださってありがとうございます。
それで、早速教えていただいたスクリプトで試してみたのですが、どうしてもうまくいきません。

最初の

#!/usr/bin/perl

の部分を

#!/usr/local/bin/perl

に変えて

@array = ("画像");

の "画像" となっているところをパックされたデータに差し替えてアップロードしたのですが…。
どこが間違っているのか教えていただけないでしょうか。
よろしくお願いします。
何度もすみません…。
回答者 sim  [削除]  投稿日 2004/3/26(金) 04:53:34
#!/usr/bin/perl

if($ENV{'QUERY_STRING'}){&$ENV{'QUERY_STRING'};}

print "Content-type: text/html\n\n";
print "<html><head><title>Test</title></head>\n";
print "<body>\n";
print "Hellow!\n";
print "<hr>\n";
print "<img src='./this.cgi?Image'>\n";
print "</body></html>\n";
exit;

sub Image {
 @array = ("画像");
 print "Content-type: image/gif\n\n";
 foreach (@array) {
  $data = pack('H2',$_);
  print $data;
 }
exit;
}


1.このCGIのファイル名をthis.cgiにしているか?
 print "<img src='./this.cgi?Image'>\n";の部分がこのCGIファイル名になるようにしてみてください
2.if($ENV{'QUERY_STRING'}){&$ENV{'QUERY_STRING'};}を
  if($ENV['QUERY_STRING'] eq 'Image'){&Image;}に変えてみたらどうか?

などを試してみてください。
質問者 えま  [削除]  投稿日 2004/3/26(金) 22:44:51
simさま、ありがとうございます。
2.の方法でエラーは出なくなったのですが、画像だけが表示できません。
リンク切れの時のように赤い×マークが表示されてしまうのです…。
すみませんがこの部分についてだけ、もう一度アドバイスいただけませんでしょうか。
本当に何度も申し訳ありませんです…。
回答者 トンマ  [削除]  投稿日 2004/3/28(日) 13:31:07
このスクリプトの動作がよく分かっていないのですが
『binmode(STDOUT);』を付けてみたら同ですか?

#!/usr/bin/perl

if($ENV{'QUERY_STRING'}){&$ENV{'QUERY_STRING'};}

print "Content-type: text/html\n\n";
print "<html><head><title>Test</title></head>\n";
print "<body>\n";
print "Hellow!\n";
print "<hr>\n";
print "<img src='./this.cgi?Image'>\n";
print "</body></html>\n";
exit;

sub Image {
 binmode(STDOUT);
 @array = ("画像");
 print "Content-type: image/gif\n\n";
 foreach (@array) {
  $data = pack('H2',$_);
  print $data;
 }
exit;
}
なんとなく思うんですが、
こんな方法とるより

#!/usr/bin/perl

if($ENV{'QUERY_STRING'}){&$ENV{'QUERY_STRING'};}

print "Content-type: text/html\n\n";
print "<html><head><title>Test</title></head>\n";
print "<body>\n";
print "Hellow!\n";
print "<hr>\n";
print "<img src='./this.cgi?Image'>\n";
print "</body></html>\n";
exit;

sub Image {
 binmode(STDOUT);
 open(IN,"./適当なフォルダー名/画像ファイル名");
 binmode(IN);
 @img = <IN>;
 close(IN);

 print "Content-type: image/gif\n\n";
 foreach (@img) {
  print $_;
 }
exit;
}

こっちのほうが簡単だと思います。
しかも、適当なフォルダー名に.htaccessなどでアクセス制限しておけば
見ることはできなくなると思います。
質問者 えま  [削除]  投稿日 2004/3/29(月) 01:34:43
トンマさま、ありがとうございます。
教えていただいたスクリプトを2つとも試させていただいたのですが、エラーになってしまいました…。
それで、

if($ENV{'QUERY_STRING'}){&$ENV{'QUERY_STRING'};}

の部分を

if($ENV['QUERY_STRING'] eq 'Image'){&Image;}

に書き換えてみるとエラーは出なくなるのですが、やはり画像だけは表示されなくて…。
何か原因と思われるものがありましたら教えていただけると嬉しいです。
お尋ねしてばかりで本当にすみません…。

返信(回答)する

 


Web裏技