In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

2009-3-14 選んだファイルを Base64 エンコードする

選んだファイルを Base64 エンコードするサンプル

外部サーバを通さずに、 Flash 内でファイルの処理を行います。
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;
        }
    }
}