2013年6月25日火曜日

JavaScript内のデータをFlashのファイルダイアログで保存することはできるか?

先日、SafariとOperaのファイル保存問題を解決する糸口を見つけた。

琴線探査: 「Downloadify」Safari・Operaのファイル保存問題解決の糸口

一言で言ってしまえば、FlashのExternalInterfaceを使ってJavaScript内のデータをFlashに送り込み、Flashのファイルダイアログで保存できないか?という話。

結論から言うと、すぐに頓挫した。試したのはこんなコード。

package {

  import flash.display.Sprite;
  import flash.external.ExternalInterface;
  import flash.net.FileReference;
  
  public class FileSaver extends Sprite {

    public function FileSaver() {
      ExternalInterface.addCallback("toSWF", toSWF);
    }

    public function toSWF(text:String):void {
      try {
        var fr:FileReference = new FileReference();
        fr.save(text, "ファイル.txt");
      } catch (err:Error) {
        ExternalInterface.call("alert", err.toString());
      }
    }

  }

}

確かにブラウザからFlashにデータを送り込むことはできた。しかし、ブラウザ側(JavaScript)からtoSWF()を呼ぶと、保存しようとしたところでエラーになる。


一体、このエラーコード「#2176」とは何か?

ランタイムエラー - Adobe ActionScript® 3(AS3 )API リファレンス

2176
ポップアップウィンドウを表示するアクションなどの特定のアクションは、マウスをクリックしたりボタンを押したりするユーザー操作によってのみ呼び出すことができます。

つまり、JavaScriptからFlashのFileReference.save()を呼び出すと、セキュリティーエラーになるというわけ。。。

_| ̄|○

DownloadifyがわざわざFlash内でボタンを作っていたのは、そういった理由があったというわけだね(^^);

う~ん。これは素直にDownloadifyを使ったほうがいいかも。