2015. 2. 5. 11:22

모바일(앨범)에서 이미지 업로드(CameraRoll사용, 임시파일 생성방식)

임시파일 생성보다는 다이렉트로 올리는게 더 리소스를 작게 사용하나 참고소스로 남겨 둠

받는 쪽에서는 일반적인 파일 업로드 방식(PHP -> $_FILES)으로 사용


package com.utils
{
	import flash.events.ErrorEvent;
	import flash.events.Event;
	import flash.events.IEventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.events.MediaEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.media.CameraRoll;
	import flash.media.MediaPromise;
	import flash.net.URLRequest;
	import flash.utils.ByteArray;
	import flash.utils.IDataInput;

	public class ImageSelector
	{
		private var cr:CameraRoll;
		private var dataSource:IDataInput;
		private var eventSource:IEventDispatcher;
		private var tempDir:File;
		private var temp:File;
		
		public function ImageSelector()
		{
			cr = new CameraRoll();
		}
		
		public function getImage():void
		{
			if(!CameraRoll.supportsBrowseForImage)
				return;
			
			cr.addEventListener(MediaEvent.SELECT, onImageSelect);
			cr.addEventListener(Event.CANCEL, onBrowseCancel);
			cr.addEventListener(ErrorEvent.ERROR, onMediaError);
			cr.browseForImage();
		}
		
		private function onImageSelect(e:MediaEvent):void
		{
			var imagePromise:MediaPromise = e.data;
			dataSource = imagePromise.open();
			
			if(imagePromise.isAsync)
			{
				eventSource = dataSource as IEventDispatcher;
				eventSource.addEventListener(Event.COMPLETE, onMediaLoaded);
			}
			else
			{
				readMediaData();
			}
		}
		
		private function onMediaLoaded(e:Event):void
		{
			eventSource.removeEventListener(Event.COMPLETE, onMediaLoaded);
			readMediaData();
		}
		
		private function readMediaData():void
		{
			var imageBytes:ByteArray = new ByteArray();
			dataSource.readBytes(imageBytes);
			
			tempDir = File.createTempDirectory();
			
			var now:Date = new Date();
			var filename:String = "IMG" + now.fullYear + now.month + now.hours + now.minutes + now.seconds + ".jpg";
			temp = tempDir.resolvePath(filename);
			
			var stream:FileStream = new FileStream();
			stream.open(temp, FileMode.WRITE);
			stream.writeBytes(imageBytes);
			stream.close();
			
			temp.addEventListener( Event.COMPLETE, uploadComplete );
			temp.addEventListener( IOErrorEvent.IO_ERROR, ioError );
			
			var serverURL:String = "http://업로드할경로";
			if(!serverURL.length)
			{
				removeTempDir();
				return;
			}
			
			try
			{
				temp.upload( new URLRequest( serverURL ) );
			}
			catch( e:Error )
			{
				trace( e );
				removeTempDir();
			}
		}
		
		private function removeTempDir():void
		{
			tempDir.deleteDirectory( true );
			tempDir = null;
			dispose();
		}
		
		private function uploadComplete(e:Event):void
		{
			dispose();
		}
		
		private function ioError(e:IOErrorEvent):void
		{
			dispose();
		}
		
		private function onBrowseCancel(e:Event):void
		{
			cr.removeEventListener(MediaEvent.SELECT, onImageSelect);
			cr.removeEventListener(Event.CANCEL, onBrowseCancel);
			cr.removeEventListener(ErrorEvent.ERROR, onMediaError);
		}
		
		private function onMediaError(e:ErrorEvent):void
		{
			cr.removeEventListener(MediaEvent.SELECT, onImageSelect);
			cr.removeEventListener(Event.CANCEL, onBrowseCancel);
			cr.removeEventListener(ErrorEvent.ERROR, onMediaError);
		}
		
		private function dispose():void
		{
			temp.removeEventListener(Event.COMPLETE, uploadComplete);
			temp.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
			
			cr.removeEventListener(MediaEvent.SELECT, onImageSelect);
			cr.removeEventListener(Event.CANCEL, onBrowseCancel);
			cr.removeEventListener(ErrorEvent.ERROR, onMediaError);
		}
	}
}