티스토리 툴바



2008/09/04 17:05

액션스크립트 업로드 매니저

거의 기본적인 기능으로 구현된 업로드 매너저를 만들어 보았다.
파일을 선택했을때 파일명과 파일이 저장된 저장경로를 사용자 이벤트를 통하여 디스패치 시켰다.




UploadMgr.as

  1. package managers
  2. {
  3.     import events.UploadEvent;
  4.    
  5.     import flash.events.DataEvent;
  6.     import flash.events.Event;
  7.     import flash.events.EventDispatcher;
  8.     import flash.events.IOErrorEvent;
  9.     import flash.events.SecurityErrorEvent;
  10.     import flash.net.FileFilter;
  11.     import flash.net.FileReference;
  12.     import flash.net.URLRequest;
  13.    
  14.     import mx.controls.Alert;
  15.    
  16.     public class UploadMgr extends EventDispatcher
  17.     {
  18.         private var _fileRef:FileReference;
  19.         private var _fileSavePath:String;
  20.        
  21.         public function get fileSavePath():String
  22.         {
  23.             return _fileSavePath
  24.         }
  25.        
  26.         public function UploadMgr()
  27.         {
  28.             _fileRef = new FileReference();
  29.             _fileRef.addEventListener(Event.SELECT, fileSelectHandler);
  30.             _fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, fileUploadCompleteDataHandler);
  31.             _fileRef.addEventListener(IOErrorEvent.IO_ERROR, fileIOErrorHandler);
  32.             _fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, fileSecuErrorHandler);
  33.         }
  34.        
  35.         public function onFileBrowser():void
  36.         {
  37.             _fileRef.browse(setFileFilter());
  38.         }
  39.        
  40.         private function setFileFilter():Array
  41.         {
  42.             var filter0:FileFilter =
  43.                 new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png");
  44.            
  45.             var filterSet:Array = new Array();
  46.             filterSet.push(filter0);
  47.            
  48.             return filterSet;
  49.         }
  50.        
  51.         public function sendFileRef(url:String):void
  52.         {
  53.             var request:URLRequest = new URLRequest();
  54.             request.url = url;
  55.  
  56.             _fileRef.upload(request);
  57.         }
  58.        
  59.         private function fileSelectHandler(event:Event):void
  60.         {
  61.             var name:String = event.currentTarget.name;
  62.             var e:UploadEvent = new UploadEvent(name, UploadEvent.SELECT);
  63.            
  64.             dispatchEvent(e);
  65.         }
  66.        
  67.         private function fileUploadCompleteDataHandler(event:DataEvent):void
  68.         {
  69.             var fileSavePath:String = event.data.toString();
  70.             var e:UploadEvent = new UploadEvent(fileSavePath, UploadEvent.COMPLETE_DATA);
  71.            
  72.             dispatchEvent(e);
  73.         }
  74.        
  75.         private function fileIOErrorHandler(event:IOErrorEvent):void
  76.         {
  77.             Alert.show("IO Error");
  78.         }
  79.        
  80.         private function fileSecuErrorHandler(event:SecurityErrorEvent):void
  81.         {
  82.             Alert.show("Security Error");
  83.         }
  84.     }
  85. }



파일필터를 추가할땐 fileSet배열에 추가시켜주면 된다.




UploadEvent.as

  1. package events
  2. {
  3.     import flash.events.Event;
  4.  
  5.     public class UploadEvent extends Event
  6.     {
  7.         public static const SELECT:String = "select";
  8.         public static const COMPLETE_DATA:String = "completeData"
  9.        
  10.         public var result:Object;
  11.        
  12.         public function UploadEvent(result:Object, type:String, bubbles:Boolean=false)
  13.         {
  14.             super(type, bubbles);
  15.             this.result = result;
  16.         }
  17.        
  18.         override public function clone():Event
  19.         {
  20.             return new UploadEvent(result, type, bubbles);
  21.         }
  22.     }
  23. }





적용 액션스크립트 코드

  1. import events.UploadEvent;
  2. import managers.UploadMgr;
  3.  
  4. private var uploadMgr:UploadMgr;
  5.  
  6. private function init():vod
  7. {
  8.     uploadMgr = new UploadMgr();
  9.     uploadMgr.addEventListener(UploadEvent.SELECT, fileSelectHandler);
  10.     uploadMgr.addEventListener(UploadEvent.COMPLETE_DATA, fileUploadCompleteDataHandler);
  11. }
  12.  
  13. private function fileSelectHandler(event:UploadEvent):void
  14. {
  15.     var fileName:String = event.result.toString();
  16. }
  17.  
  18. private function fileUploadCompleteDataHandler(event:UploadEvent):void
  19. {
  20.     var fileSavePath:String = event.result.toString();
  21. }

Trackback 0 Comment 0
2008/09/02 10:56

플렉스 TextInput과 TextArea 한글입력시 느린 반응속도 해결법

기본 컴포넌트 그대로 사용하면 한글 입력시 입력반응속도에 버퍼가 있는걸 느낄것이다.
해결방법은...

TextInput만 가지고 설명하겠다.
TextArea도 TextInput과 같이 해결해주면 된다.

사용자 컴퍼넌트를 만들어 처리해주면 될텐데
mxml 사용자 컴포넌트와 액션스크립트 사용자 컴포넌트 두가지를 만들어 봤으며
돌아가는 방식은 동일하다.

일단 comp라는 패키지에 두가지 방법을 다 구현해 보겠다.



사용자 정의 컴포넌트 방식 - TxtInput.mxml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:TextInput xmlns:mx="http://www.adobe.com/2006/mxml"
  3.     focusIn="onFocusIn()"
  4.     focusOut="onFocusOut()">
  5.    
  6.     <mx:Script>
  7.        <![CDATA[
  8.            private function onFocusIn():void
  9.            {
  10.                textField.alwaysShowSelection = true;
  11.            }
  12.            private function onFocusOut():void
  13.            {
  14.                textField.alwaysShowSelection = false;
  15.            }
  16.        ]]>
  17.    </mx:Script>
  18.  
  19. </mx:TextInput>


comp라는 폴더에 TextInput을 베이스로 하는 사용자 컴포넌트를 생성한다.
focusIn, focusOut 이벤트에 textField.alwaysShowSelection 값을 적용시켜준다.




액션스크립트 클래스 방식 - TxtInput.as

  1. package comp
  2. {
  3.     import flash.events.FocusEvent;
  4.    
  5.     import mx.controls.TextArea;
  6.  
  7.     public class TxtArea extends TextArea
  8.     {
  9.         public function TxtArea()
  10.         {
  11.             super();
  12.            
  13.             addEventListener(FocusEvent.FOCUS_IN, onFocusInHandler);
  14.             addEventListener(FocusEvent.FOCUS_OUT, onFocusOutHandler);
  15.         }
  16.        
  17.         private function onFocusInHandler(event:FocusEvent):void
  18.         {
  19.             textField.alwaysShowSelection = true;
  20.         }
  21.        
  22.         private function onFocusOutHandler(event:FocusEvent):void
  23.         {
  24.             textField.alwaysShowSelection = false;
  25.         }
  26.     }
  27. }


돌아가는 내용은 같다.
사용법 또한 같다.
다만 as가 generated 과정이 없으니 아~주~~ 미세하나마 속도가 났겠지..

두가지 경우 모두
xmlns:comp="comp.*" 네임스페이스 등록하고
<comp:TxtInput /> 사용하면 된다.
Trackback 0 Comment 0