JavaScript内のデータをFlashのファイルダイアログで保存することはできるか?
先日、SafariとOperaのファイル保存問題を解決する糸口を見つけた。
琴線探査: 「Downloadify」Safari・Operaのファイル保存問題解決の糸口
一言で言ってしまえば、FlashのExternalInterfaceを使ってJavaScript内のデータをFlashに送り込み、Flashのファイルダイアログで保存できないか?という話。
結論から言うと、すぐに頓挫した。試したのはこんなコード。
確かにブラウザからFlashにデータを送り込むことはできた。しかし、ブラウザ側(JavaScript)からtoSWF()を呼ぶと、保存しようとしたところでエラーになる。
一体、このエラーコード「#2176」とは何か?
ランタイムエラー - Adobe ActionScript® 3(AS3 )API リファレンス
つまり、JavaScriptからFlashのFileReference.save()を呼び出すと、セキュリティーエラーになるというわけ。。。
_| ̄|○
DownloadifyがわざわざFlash内でボタンを作っていたのは、そういった理由があったというわけだね(^^);
う~ん。これは素直にDownloadifyを使ったほうがいいかも。
琴線探査: 「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を使ったほうがいいかも。
コメント
コメントを投稿