カテゴリー
未分類

progression検証 #5 フォルダ構成を変えてみる

系のお話は休憩して、HTML系のお話。
プロジェクトではにアップするデータは”deploy”フォルダにまとめられています。

index.html
corssdomain.
index.swf
preload.swf
└/contents
 ├/images/(デフォルトではFlash Playerのバナー)
 ├/objects/(version.swfのみ)
 ├/scripts/(swfAddress,swfobject,swfforcesize,progression.js)
 └/styles/(default.)

という形になっています。
swf系は”swf”と言うディレクトリにまとめたい性格なので、変更してみます。
まず、”swf”フォルダを作り、その中に”index.swf”,”preloader.swf”を移動します。
次に”index.html”の中の”swf”参照先を変更します。

に変更。
Flaファイル”index.fla”、”preloader.fla”のき出し先を”/swf”以下に設定。
この時点で”preloader.fla”をパブリッシュするとプレビューでは”index.swf”をloadしてくれる。ただし、”index.html”からでは”index.swf”はLoadされない。これは”swf”の基点がhtmlベースになっているため。でオデは普通swfObjectに”so.addParam( “base”, “.” );”という一文を追加して、swf基点に書き換えてしまうので、とりあえずそれをやってみた結果は、
サーバ上:正常動作。
ローカル:”index.swf”が読み込まれない。
というちょっとアレ?な結果。
で、”Preloader.as”のコンストラクタに”useSWFBasePath = false;”という設定がある。
このuseSWFBasePath は

url プロパティの値に相対パスを使用した際に、SWF ファイルの設置されているフォルダを基準とするかどうかを取得または設定します。 ただし、読み込み処理が開始された以降は設定を変更することはできません。

ということらしい。”base”と同じような働きをするような感じ・・。
ということでこれを使ってみる。


まず”index.html”の”so.addParam( “base”, “.” );”を削除して、”Preloader.as”コンストラクタで”useSWFBasePath = true;”に変更。で結果。
オーサリングプレビュー:OK。
ローカルindex.html:”index.swf”読み込まれず。
サーバ index.html:”index.swf”読み込まれず。
あら?ということで、サーバ上の通信を見てみると、”index.swf”を”[ドメイン]/swf/index.swf”で参照している。
“useSWFBasePath”の使い方を間違っているのかしら??
ドキュメントルートを基点とした絶対パスになるということなのだろうか?
それともどこか他の場所で基点urlを設定する必要があるのか??
ちょいとここで今停止中。
added 2008/10/21 18:08
“CastPreloader”を今見ているのだけど、useSWFBasePathはflashVarsで設定するのだろうか?
それとも”ExDocument”クラスでが定義される前でurlが取得できてない??
それか相対していでも暗黙的に絶対パスで指定している?(ローカルファイルパスが文字化け?)
むむむ・・・。
ちょっと他の外部データのLoadとか試してみないとこれだけじゃ良く分からないな・・。
added 2008/10/21 18:15
オデのローカルフォルダのネーミングルールが悪かったっぽい。
フォルダ名に”#”を良く使うのだけど、これがローカルで動作しない原因だったっぽい。つまり相対指定をしたとしても一応絶対パスは内部的に持っていて、そこを起点にしてファイルアクセスしているということかな?ただ”useSWFBasePath”はどちらにしてもサーバ上でドキュメントルート基点で動作してしまうので、今はbase指定で対応しています。
added 2008/10/29 7:24
の発生条件が見えてきました。どうやら問題はフォルダ名の文字数にあるようです。
問題の切り分けをするためにtaka:niumさんから貰ったサンプルをそのまま使って検証してみます。
サンプルを以下の7つのフォルダにアップしてみます。
A)http://www.img8.com/test/deploy/
B)http://www.img8.com/test/1/
C)http://www.img8.com/test/01/
D)http://www.img8.com/test/015/
E)http://www.img8.com/test/a/
F)http://www.img8.com/test/aa/
G)http://www.img8.com/test/aaa/
A)は問題なく動作します。
B)1桁フォルダ名:OK。
C)2桁フォルダ名:NG。02,03等にしてもNG。
D)3桁フォルダ名:OK
E)1文字フォルダ名:OK。
F)2文字フォルダ名:NG。他の文字にしてもNG。
G)3文字フォルダ名:OK。
原因はまだ突き止めていませんが、どうも2文字のフォルダ名だとサーバのドキュメントルートを参照して動作するようです。今回オデがこの問題に遭遇したのはディレクトリ名を”02″にしていたからのようです。ということでディレクトリ名を3文字にしたら今まで動かなかったものも正常に動作するようになりました。
いや~長かった・・・汗 フォルダ構成を変えたのは変えたけど、まさか上位のフォルダの名前に原因があったとは予想できなかった・・・。Indexクラスとかが悪さをしているのかと思って何度も作り直してしまったw
Progressionの仕様で2文字のフォルダ名が禁止されているのか?まだ調べていませんが、なんにせよ2文字のフォルダ名を使うとbasepathに問題が発生するようです。っつーか既出だったらスイマセン。
ちともう眠たいので一旦落ちます。

「progression検証 #5 フォルダ構成を変えてみる」への10件の返信

Twitter の叫びを見てちょっと試してみましたが、問題なく動くようですね。
http://nium.jp/tests/useSWFBasePath/
http://nium.jp/tests/useSWFBasePath/MyProject-2.zip
so.addParam( “base”, “.” ); と useSWFBasePath の違いは、影響範囲が index.swf だけなのか他にも影響が生じるのかというところです。
また、設定するタイミングはスクリプト内でも flashVars でもどちらでも同じプロパティを設定することになるので、お好きな方で大丈夫です。
原因はちょっと分からないのですが、気になったのは fla の書き出し先に swf/ が追加されていなくて、swf ファイルが最新になっていないとかはどうでしょうか・・・。

すいません、コメントにURLが記述されていたので公開が保留されていて気づくの遅れました。サンプルありがとうございます!
追記で書いたとおり、私のフォルダの名前が悪かったのが基本的な原因でした。ただそれを変えてもuseSWFBasePath=trueではサーバ上でドキュメントルート基点になったままだったので、この部分明日確認してみます!

確かに頂いたデータだときちんと動作しています・・・。しかしオデのは何故おかしな挙動を示す・・・。ちょっとまだ二つの違いが見出せておりません・・・。も少し検証してみます。

遅くなりましたが、無事動くようになりました。・swfObjectのbase指定は無し。
・Preloaderクラスコンストラクタで
url = “index.swf”;
useSWFBasePath = true;
で動くようになりました。
一応このパターンも検証して正常動作しなくてはまっていた訳ですが、何故動くようになったのか?が結局良く分からないままであります・・。
うーん、でもまぁオデのミスであることは間違いない!
しかし一体どういう風になってドキュメントルートを参照するようになっていたのだろうか?
それはそれで便利そうな機能ではあるのだけど・・・。(既にドキュメントルートを参照できないw)
も少し調べてみますが、一応基本的には問題ないということで・・・お騒がせしました。

この現象の発生条件が分かったので追記しておきます。ただ理由が仕様なのか、バグなのかまで調べられていませんけど・・・。

二文字だと hoge フォルダを指定したときにこんな感じになるんですかー?
http://www.img8.com/hoge
・・・ひょっとして正規表現が原因なのかも・・・。
とソース確認してみたら jp.nium.utils.StageUtil.toSWFBasePath(url);
の正規表現内の「.」がエスケープされてなくて2文字だと「/../」と勘違いしてるっぽいですねー。

>二文字だと hoge フォルダを指定したときにこんな感じになるんですかー?
ですです、サーバドキュメントルートが基点になります。
>とソース確認してみたら jp.nium.utils.StageUtil.toSWFBasePath(url);
の正規表現内の「.」がエスケープされてなくて2文字だと「/../」と勘違いしてるっぽいですねー。
おお、まだそこまでみてなかった。これは勝手に直してよいのだろうか・・。いや別にフォルダ名2文字にしなければいいのか・・・w

jp.nium.utils.StageUtil.toSWFBasePath(url);
をみてみました。
確かに
var pattern:String = “/[^/]+/[^/]+/../”;
の部分ですね。
../swf/aaa.swf
みたいな設定を
aaa.swf
に変換しているんですねぇ・・。
この部分は
/swf/../swf/aaa.swf
でも多分正常に動作するとは思うのですが、他にどんな例外があるのかまだ深く詰めれていません。
っつーか正規表現なんかPerl以来で全然思い出せません。
var pattern:String = “/[^/]+/[^/]+/\.\./”;
ってしたけど全然駄目でした・・汗
ちなみに色々調べていて気づいたのですが、サーバドキュメントルートというよりも、
swf/../swf/aaa.swf

swf/aaa.swf
にするための処理なので、2階層分のディレクトリがカットされているというのが正確なところかもしれません。検証場所の状態が丁度2階層下だったので、勘違いしてたみたいです。

検証していただきありがとうございます!
問題箇所と原因はご指摘の通りです。
解決方法ですが、エスケープ処理のために . の前に \ を追加するのは正しいのですが、\ 自体もエスケープされてしまいますので、以下のように修正する必要がありそうです。
var pattern:String = “/[^/]+/[^/]+/\\.\\./”;
この修正は次のバージョンアップ内容に反映させて頂きますので、当面は直接修正してご使用ください。
#バージョンアップ後、既存プロジェクトについてもオートアップデータをかけることで、正式版に Fix されます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です