ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

超初心者向けCGI講座コミュのブラウザによってFlashが表示されません

  • mixiチェック
  • このエントリーをはてなブックマークに追加
みなさま、初めまして。りゅと申します。

こちらもざっと拝見し、またmixi外でも質問をしたのですが、解決しなかったので、ダブルポストになりますが、質問させてください。

swfファイルの置き場を出来るだけ隠したく、ネットに載っていたコードを参考に下記の通り書いた所、Mac上のIE5.1ではflashが表示されるのですが、NC4.7ではバイナリ表示になってしまいます。Win2k上のIE6では、「ダウンロードファイル」が表示され、”開く”では実行されず真っ白な画面のまま、”保存”を選ぶと、○○.cgiが保存されますが、中身は、実際のコードと違いバイナリのようです。

Mac OS X (10.3.9)でも試したところ、IE5.2ではwin2kと同じようにブラウザが真っ白に、Safari1.3.1ではバイナリが表示されてしまいました。Mac OS 9.2にもN7.02を入れてみたのですが、こちらはずっと読み込み中で、強制終了させる他、ありませんでした。

プラグインの問題かとも思い、swfファイルを直接ブラウザに読み込ませてみた所、NC4.7・Safari1.3.1・N7.02では、自宅作・他作共に動いたのですが … 。

作成環境はMac OS 9.2でローカルサーバはFreeBSDにApacheを入れてもらっています。

ネット上でかなり検索したのですが、検索方法が悪いのか、解決方法をみつけられず、困っています。みなさまのお知恵を拝借できれば幸いです。よろしくお願いいたします。

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
$file = "../tekito.swf";
if (-e $file) {
print "Content-Type : application/x-shockwave-flash\n\n";
open(IN, "$file") or die;
binmode(IN);
binmode(STDOUT);
while(<IN>) {print} ;
close(IN);
}
else {
print "Content-type: text/html\n\n";
print "no file";
}
exit(0);

コメント(16)

こんにちは。
ブラウザ毎によって動作が変わるのであれば、ヘッダの部分の記述が間違っている可能性が高いですね。

実際Flashを直接呼び出した時に出力されているヘッダを全て出してみると動きそうな気がします。
みずのさん、こんにちは。

ヘッダ部分というと、MIME設定ということでしょうか。
未熟者ゆえ、少し調べて(学習して(^^;))、結果をこちらにご報告しますね。

ありがとうございました。
print "Content-Type : application/x-shockwave-flash\n\n";



print "Content-Type: application/x-shockwave-flash\n\n";

とか?

コロン(:)の前後の空白を正しく記述しないと解釈しないUAがあるかもしれないですねぇ。
KIDD(きっど) さん、ありがとうございます!

まさにご指摘の通りでした。あまりにも初歩的なミスで恥ずかしい限りですが、空白一つでも、結果が変わる事があるということを再認識しました。(この10日余りはなんだったのだろうと、情けなくなりますが。(^_^;)ゞ)

本当に助かりました。ありがとうございました〜。
自分も以前Locationヘッダの出力で同じことしてハマったというか、そこそこつい最近まで、「前後のスペースってどうだったっけ・・・」と悩むことがあります。

んで、CGI.pmを使えばheaderメソッドがあるのでそれを使えば安全というかそういうミスはないですよね。

CGI.pmの中では単にこうしてるだけですけど。
push(@header,"Content-Type: $type") if $type ne '';

この10日あまりはそのとき調べた道筋で得たものがなにかあると思うのでそれで十分payしてる方向で。:-)

#っていうか多分これだろうなと思っていたがこのトピがみずのさんの投稿であがってくるまでコメントし忘れてたんだよね・・・^-^;;
ヘッダを無視して拡張子だけを見るブラウザや、
その逆もあるわけで……

ファイルの種類やターゲットとする閲覧環境によっては
更に一捻りすることになりそうです(笑)
あまりにもコミュタイトルの通りなので↑に書かなかったのですが、超超初心者なのでCGI.pmを知らず、調べる時間が取れなくて、お返事が遅くなってしまいました。m(_ _)m

なるほど、CGI.pmはすごく便利そうですね!今度頑張って?使ってみたいと思います。

>この10日あまりはそのとき調べた道筋で得たものがなにかあると思うのでそれで十分payしてる方向で。:-)

あまりにも知らないことが多すぎて手探り状態だった為、タコな事ばかりしてしまいましたが、そう言って頂けると救われます。(笑)

>ファイルの種類やターゲットとする閲覧環境によっては 更に一捻りすることになりそうです(笑)

そうなんですか。いろいろな環境に合わせるのは奥が深いのですね。今扱うのは、Flashに+α程度ですが、今後一捻り(笑)する必要があるかもしれないことを心に留めて、気をつけたいと思います。

みなさん、ありがとうございました。こちらは本当に勉強になります。また何かありましたら、よろしくお願いいたします。
ヘッダを調べることで結構多くの問題を解決できたりします。

このヘッダですが、パケットモニタと呼ばれるツールを利用することで容易に取得することが出来ます。

私は以下の2種類を使い分けてます。

Fiddler
http://www.fiddlertool.com/fiddler/version.asp

パケモニ
http://www.vector.co.jp/soft/winnt/net/se378450.html


FiddlerはMicrosoft関連のソフトのようです。
そのため、恐らくIEでしか利用できません。

ソフトの使い方などはreadmeや最寄のサイトを調べてみてください。

perlで大きなファイルを書き出す時はきちんと304ステータスを返すような仕組みを作っておくと良いかも知れません。
簡単にぐぐって見たのですが、解りやすそうなのを見つけることが出来ませんでした。
みずのさん、ありがとうございます。

知らない単語ばかりだったので、また、お返事が大変遅くなってしまいました。m(_ _)m

HTTP ステータス行というのは、なんとなく理解できました。今はまだ扱いませんが、数ヶ月以内に少し大きめのswfファイルを扱う予定があるので、もう少し勉強してみます。そのような配慮をする必要があることを知らなかったので、助かりました。

ヘッダを調べるというのは、ヘッダの含まれている部分のパケットをみつけて、内容を判別するということでしょうか。(書いていて、わかっているのかな自分、という気がしてきますが … (^^;)) もう少し探してマック用のソフトをみつけられなかったら、上記のウィン用のを試してみますね。

確認(調べ)作業がトロくて、お返事がいつも遅れてすみません。
本当にありがとうございました。
内容を判別するのはブラウザのお仕事ですね。

通常、swfという拡張子であればこんなヘッダを書いちゃうよ!てなことをapacheなどが適当に判断して出力しています。

これがCGIとなるとこのヘッダを自分で書き出す必要があります。

Content-type: text/html
こいつもそのヘッダの一部ですね。

正しいヘッダについて詳しく調べてしまうのが一番良いかと思いますが、実際に使用されているヘッダを見様見真似で書いてしまうのが手っ取り早いと思います。

そのため、前述したとおり実際のswfを読んだ時のヘッダを参考にして書き出すという手段が有効ではないかと思うのです。

ファイルネームやらファイルサイズなど、ファイルによって情報が変わる部分を正しく書き換えて出力することで、いろんなブラウザで見ても動作するような動作になると思います。

以下はとあるページでswfを表示した時のヘッダです。

HTTP/1.1 200 OK
Date: Tue, 03 Oct 2006 01:54:35 GMT
Server: Apache/1.3.20 Sun Cobalt (Unix) mod_ssl/2.8.4 OpenSSL/0.9.6 PHP/4.2.3 FrontPage/5.0.2.2510 mod_perl/1.26
Last-Modified: Sat, 31 Jan 2004 14:39:10 GMT
ETag: "1001612a-1429d-401bbe0e"
Accept-Ranges: bytes
Content-Length: 82589
Connection: close
Content-Type: text/plain
お返事が本当に本当に遅くなってすみません。毎度毎度”やってみます”だけでは情けないので、みずのさんのおっしゃる通り、よそのヘッダを実際に読み取ってから、書き込もうと思ったのですが、なかなか作業ができなかったのと、tcpdumpの海を彷徨って遅くなってしまいました。とりあえず、よくわからないままにも、なんとなくモニタはできるようになったので、他を参考にしながら、もう少し書いてみます。みずのさんが書いてくださらなかったら、この手のことを知らないまま、人のサイトを作っているところでした。(汗っ) 本当にありがとうございました。

> Content-Type: text/plain

これは素のデータを渡して、ブラウザの判断に任せるということなのでしょうか。
>10

亀レスすいません。

Content-typeの書き出しはApacheが拡張子から判断して書き出すと思うのですが、多分swfのContent-typeってデフォルトでは入ってないと思うんです。

なので、ここはDefaultTypeで設定しているContent-typeが書き出されているのだと思います。

CGIで書く時はapplication/???? とかで書いた方が親切じゃないかな?と思います。
13:みずのさん

ほー、そうなのか、と思い、少し自分のサーバを調べてみました。うちのサーバはちゃんとapplication/x-shockwave-flashを返すので。

そしたら

<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig conf/mime.types
(略)
</IfModule>

ってな指定もありまして、それを追ってconf/mime.typesファイルを見たら

application/x-shockwave-flash swf

な指定がありました。
(何の参考だか謎ですが)参考までに。
なるほどー。

それではどっかで見たとこのApacheが古かったのかも知れませんね笑
今確認してみたら、確かにswfが加わってました。

mime.typesはほとんど使わないようなのまで沢山載ってると思うので、消しちゃったりすると多少軽くなったりします。

CGIでContent-typeを書き出す時とかは参考になったりします。
#javascriptの書き出しにapplicationで書くかtextで書くか悩んだり。
なるほど…わざわざすみません。Apacheの設定等サーバのことはやってもらっているので、よくわからないのですが、書き方、参考になりました。お2人とも、ありがとうございました〜。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

超初心者向けCGI講座 更新情報

超初心者向けCGI講座のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング