FileReferenceはローカル変数で使えない
以前書いた、NetConnectionもそうだったのですが FileReferenceもローカル変数に定義しただけだとうまく動きません。
オンラインのファイルをダウンロードしようとして 処理の流れも問題なく、保存用のダイアログでるんだけど 実際には保存されてなくてずーっとはまってました。
検証用にFlaファイルつくって、タイムラインに書くとうまく行きます。 NetConnectionのときも同じ感じだったのでもしやと思ったらやっぱりそうでした。
FileReferenceインスタンスはインスタンスメンバまたはクラスメンバとして定義する必要があります。
// 成功する package { import flash.display.Sprite; import flash.net.FileReference; import flash.net.URLRequest; public class TestFileReference extends Sprite { private var fRef :FileReference; public function TestFileReference() { fRef = new FileReference(); fRef.download(new URLRequest("http://level0.kayac.com/images/araga/valentine_2009/main.gif"), "valentine.gif" ); } } }
// 失敗する package { import flash.display.Sprite; import flash.net.FileReference; import flash.net.URLRequest; public class TestFileReference extends Sprite { public function TestFileReference() { var fRef = new FileReference(); fRef.download(new URLRequest("http://level0.kayac.com/images/araga/valentine_2009/main.gif"), "valentine.gif" ); } } }
おそらく想像ですがローカル変数だと関数のスコープから外れるとすぐにGCの対象になってしまうみたいです。
ちなみに、このことから想像できるのですが、タイムラインに定義した変数や配置したインスタンスはpublic var 的に処理されるんですね。