リモートサーバ上のファイルをファイル保存ダイアログからローカルに保存できるFileReference.download()メソッドですが、ダイアログがちゃんと出てIOError等も発生していないのに実際のダウンロードが開始されないという状態になってしまいました。

問題のコードは以下の場合。ステージのどこかをクリックしたらダウンロードを開始する・・・はずのものです。(ちなみにダウンロードするファイルはコンチの画像です。あやしいファイルじゃないのでご安心ください。)

 

package 
{
	import flash.display.Sprite;
	import flash.net.FileReference;
	import flash.net.URLRequest;
	import flash.events.MouseEvent;
	public class FlashTest extends Sprite
	{
		public function FlashTest()
		{
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}

		private function onClick(evt:MouseEvent):void
		{
			var fr:FileReference;
			fr=new FileReference;
			fr.download(new URLRequest("http://konchi-static.kayac.jp/pc/images/top/txt_love.jpg"),"test.jpg");
		}
	}
}

 ダウンロードダイアログが開いてファイル名と保存場所の指定まではうまく行きます、が、肝心のダウンロードが始まらない。

そして以下が修正版です。FileReferenceをクラスメンバとして宣言しておけばちゃんとダウンロードが開始されます。

 

package 
{
	import flash.display.Sprite;
	import flash.net.FileReference;
	import flash.net.URLRequest;
	import flash.events.MouseEvent;
	public class FlashTest extends Sprite
	{
		private var fr:FileReference; //ここで宣言しておく
		public function FlashTest()
		{
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}

		private function onClick(evt:MouseEvent):void
		{
			fr=new FileReference;
			fr.download(new URLRequest("http://konchi-static.kayac.jp/pc/images/top/txt_love.jpg"),"test.jpg");
		}
	}
}

考えられる原因としては、イベントハンドラ関数内などでFileReferenceを宣言すると、ダウンロードが始まる前に破棄されてしまうから・・・でしょうか?うーん、謎。

HTML5飯