楽天さんのFlash案件やっててちょっと躓いたのでメモ。
【検証準備】 何の変哲も無いただのローディングです
まずは、swfのソースをご覧下さい。こんな感じでテストしました。
//以下をEnterFrameで回してます private function loadSwf(e:Event):void { debug_tf.appendText("1.loading SWF... " + " bytesLoaded: " + loaderInfo.bytesLoaded + " / bytesTotal: " + loaderInfo.bytesTotal+ "n"); debug_tf.appendText( " bytesLoaded == bytesTotal ->[ " + String( loaderInfo.bytesLoaded == loaderInfo.bytesTotal ) + " ] | " + loaderInfo.bytesLoaded + " , " + loaderInfo.bytesTotal + "n" ); if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal){ removeEventListener(Event.ENTER_FRAME, loadSwf); next(); } }
3、4行目がごちゃごちゃうるさいですが、ここはあまり関係ありません。debug用のTextFieldに値を吐き出しているだけです。
要は、swfファイルの総ファイルサイズと読込み終えたファイルサイズが一致したら次進みます、ってことだけなんですけれど、このswfを楽天のサーバー[www.rakuten.ne.jp]と、自分のサーバー[file.sakotsu.jp]上にアップロードして動作確認してみました。対象ブラウザは、WindowsVista環境でFirefox3.5とChrome4.1とIE8.0の3つ。
【結果】 www.rakuten.ne.jpにアップしたswfのローディングが終わらない
さあ、このでかい画像を喰らいなさい。状況をキャプチャしたものです。
自分のサーバーにアップしたswfは何の問題も無く正常動作してるのですが、
楽天サーバーにアップしたswfは、ブラウザによってloaderInfo.bytesTotalの値が異なっていました。
Firefoxだと正常値より微増、IE・Chromeだと0になっているようです。いったいどういうことでしょうか。。
【原因?】
「どうぞおググりください」との天の声に導かれ、いつも通りにGoogleセンセに尋ねてみたところ、以下のページがヒットしました。
もうこれの仕業だと安易に決めつけて先書いちゃいますよ!もう迷わない!
一部抜粋させて頂きます。
ロードの対象の画像をサーバ側で動的にリサイズするPHPを使っていて、それがContent-Lengthを出力していなかったため、Flash側でbytesTotalが取得できず、総バイト数を取得できなかった。
とのこと。なるほど、アップロードしたファイルが細工されちゃってたらどうしようもないですね。
ていうかswfに対してもそんなこと出来ちゃうんですね。
10年ぐらい昔にあったホームページレンタルサービスのサーバーにhtmlをアップしたら、bodyタグ内に勝手に広告追加されちゃうノリですよね。
いやそれにしても、FirefoxさんだけbytesTotalの値が増えるのはこれまたどうしてなんだろね?
何回読んでも何回読んでも完了条件に絶対届かないやン!すげー意地悪なそんな仕様を早くどうにかしてあげてください。
あと、楽天サーバーの超強力なキャッシュを相手にするのもしんどいっす!
「ブラウザのキャッシュは何度も消したはずなのに、嗚呼消したはずなのに!それでも消せないスウィッフ!スウィッフ!」ですよ。
ブラウザのキャッシュではなくてサーバーのキャッシュとか、そういうのもあるのかな?それぐらいに強力でした。
【対策】
原因がわかったので対策は簡単です。読み込み完了条件をゆるゆるにすればOKなのだ!(OKかわかんないけど!)
if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal)
この条件式を、こうしました。
if (0 < loaderInfo.bytesLoaded)
もう読み込んだ瞬間に、if文通過OK。アレですよ、タッチ&GOですよ。
いやこれが100パー良いとは全然思ってないですけど、今回の場合はswf自体のファイルサイズも数十KBなので問題ありませんでした。
だってbytesTotalが0だったり、規定値より多かったりしたらどうしたらいいかわからんやん! てことで暫定こうしてます。
ただ、このswfをアクセスが超集中する高負荷なページに貼ってたら、それはそれで耐え切れなさそうですね。。エラーが拾えなさそう。
だもんで、一番の解決方法は、楽天の中の人に直してもらうのがいいのかな? 余力があったらこの件伝えてみてもいいかもですね。