package { import flash.display.Loader; import flash.display.SimpleButton; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.net.FileFilter; import flash.net.FileReference; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.utils.ByteArray; import mx.utils.Base64Encoder; import flash.system.System; /** * 選んだファイルを Base64 エンコードするサンプル * * 外部サーバを通さずに、 Flash 内でファイルの処理を行います。 */ public class Main extends Sprite { /** * ファイル参照オブジェクト */ private var fileReference:FileReference; /** * 文字列表示用 */ private var textField:TextField; /** * ファイルを選択ボタン */ private var button1:SimpleButton; /** * クリップボードにコピーボタン */ private var button2:SimpleButton; /** * 選んだファイルを表示するローダ */ private var loader:Loader; /** * 選んだファイルの内容を指す ByteArray */ private var byteArray:ByteArray; /** * コンストラクタ */ public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } /** * 初期化メソッド * @param e */ private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point // ファイルの選択ボタンの作成 button1 = new SimpleButton(); button1.upState = makeButton(0xDDDDDD, 100, 20, 10, "ファイルの選択"); button1.overState = makeButton(0xEEEEEE, 100, 20, 10, "ファイルの選択"); button1.downState = makeButton(0xCCCCCC, 100, 20, 10, "ファイルの選択"); button1.hitTestState = button1.upState; button1.addEventListener(MouseEvent.MOUSE_DOWN, onSelectButtonDown); button1.x = 5; button1.y = 80; addChild(button1); // クリップボードにコピーボタンの作成 button2 = new SimpleButton(); button2.upState = makeButton(0xDDDDDD, 130, 20, 10, "クリップボードにコピー"); button2.overState = makeButton(0xEEEEEE, 130, 20, 10, "クリップボードにコピー"); button2.downState = makeButton(0xCCCCCC, 130, 20, 10, "クリップボードにコピー"); button2.hitTestState = button1.upState; button2.addEventListener(MouseEvent.MOUSE_DOWN, onCopyButtonDown); button2.x = 110; button2.y = 80; button2.visible = false; addChild(button2); // テキストフィールドの準備 textField = new TextField(); textField.selectable = false; textField.autoSize = TextFieldAutoSize.LEFT; textField.x = 0; textField.y = 0; textField.text = "選んだファイルを Base64 エンコードするサンプル\n\nボタンを押してファイルを選んでください。\n(100KB 以下程度のファイルを選んでください。大きいファイルは処理に時間がかかります。)"; addChild(textField); // ローダーの準備 loader = new Loader(); loader.y = 110; addChild(loader); } /** * ファイルの選択ボタンが押された時 * @param event */ private function onSelectButtonDown(event:MouseEvent):void { fileReference = new FileReference(); // イベントの登録 fileReference.addEventListener(Event.SELECT, onSelect); fileReference.addEventListener(Event.COMPLETE, onComplete); // ファイル選択ダイアログを表示する var fileFilter:FileFilter = new FileFilter("画像ファイル (jpg, gif, png, swf)", "*.jpg;*.gif;*.png;*.swf"); fileReference.browse([fileFilter]); } /** * クリップボードにコピーボタンが押された時 * @param event */ private function onCopyButtonDown(event:MouseEvent):void { if (byteArray == null) { textField.text = "エラー"; return; } var base64encoder:Base64Encoder = new Base64Encoder(); base64encoder.encodeBytes(byteArray); var str:String; str = "private const data:String = \""; // 改行を取り除く var str2:String = base64encoder.toString(); var len:uint = str2.length; for (var i:uint = 0; i < len; i++) { var sub:String = str2.substr(i, 1); if (sub == "\n") continue; str += sub; } str += "\""; System.setClipboard(str); textField.text = "コピーしました。"; } /** * ファイル選択イベント * @param event */ private function onSelect(event:Event):void { fileReference.load(); } /** * 読み込み完了イベント * @param event */ private function onComplete(event:Event):void { byteArray = fileReference.data; loader.loadBytes(fileReference.data); loader.scaleX = 0.5; loader.scaleY = 0.5; textField.text = "クリップボードにコピーボタンを押すと、\nBase64 エンコードされたデータをクリップボードにコピーできます。\n1 行の文字数がかなり多いので、貼り付ける時は注意してください。"; button2.visible = true; } /** * ボタンを作って返す * @param color 色 * @param width 幅 * @param height 高さ * @param round 角丸の大きさ * @param text ボタンのテキスト * @return ボタン */ private function makeButton(color:uint, width:int, height:int, round:int, text:String):Sprite { var t:TextField = new TextField(); var s:Sprite = new Sprite(); s.graphics.lineStyle(2); s.graphics.beginFill(color); s.graphics.drawRoundRect(0, 0, width, height, round); s.graphics.endFill(); t.text = text; t.selectable = false; t.width = width; t.autoSize = TextFieldAutoSize.CENTER; s.addChild(t); return s; } } } 2009-3-14 選んだファイルを Base64 エンコードする