Flashや外部テキストをキャッシュさせない

Flashの開発で最も困るのが、ブラウザがファイルをキャッシュしてしまうということ。今回はこれを防ぐ方法を紹介します。

DVDからサイト構築まで

カテゴリー

おすすめサイト

RSS

Flashや外部テキストをキャッシュさせない

2007/02/27 22:00

フラッシュの開発で、最もやっかいな問題は、ブラウザがFlashのファイル「SWF」をキャッシュしてしまうことです。
これはブラウザの仕様らしくて、Adobeのページでもうまい解決方法が載っていません。

これを解決するには、毎回Flashを更新するたびに、ブラウザの一時ファイルの削除(「ツール」→「インターネット オプション」→「閲覧の履歴」→「削除」→「インターネット一時ファイルの削除」をクリック)をしなくてはなりません。
ところが、毎回毎回こんなことをしていたらめんどくさくてしょうがない。
そこで、HTMLではなくてPHPでページを作成してやります。たとえば、Flashのファイルが「aaa.swf」だとしたら、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8 />
<title>quest1</title>
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
<META HTTP-EQUIV="Expires" CONTENT="Mon, 04 Dec 1999 21:29:02 GMT">
</head>
<body bgcolor="#ffffff">
<!--ムービーで使用されている URL-->
<!--ムービーで使用されているテキスト-->
<object classid="clsid:aaaaaa-aaaa-11cf-aaaaaa" codebase=
"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="468" height="300" id="quest1" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="aaa.swf?<?=date("YmdHhs");?>" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="quest1.swf" quality="high" bgcolor="#ffffff" width="468" height="300" name="quest1" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>


の部分で「年月日時分秒」を繋げた値になります。
つまり、1秒ごとに全く別の値になるため、ブラウザも毎回読み込みに行くようになります。

外部ファイル・CGI/PHPから変数を読み込む場合

LoadVarsを使って外部からテキストデータを取り込むで、外部テキストファイルやCGI/PHPから変数を読み込むときの注意を書きましたが、実は、このデータもキャッシュしてしまうようです。
なので、ランダムなデータをCGIやPHPから出力するような仕様にしていても、毎回同じ値が出力されているような挙動をしてしまうと思います。
これを防ぐには、「loadメソッド」ではなく「sendAndLoadメソッド」を使用してPOSTでアクセスします。

myData = new LoadVars();
myData.onLoad = function() {
  _root.q.str = myData.re_data; //_rootに配置してある「q」の中のダイナミックテキスト「str」に表示
};
myData.sendAndLoad("aaa.php", myData, "POST");

これで毎回外部PHPファイル「aaa.php」にアクセスしてくれます。