2015. 2. 5. 16:59

모바일(앨범)에서 이미지 업로드(CameraRoll사용)

임시파일 생성없이 ByteArray를 바로 전송하는 방식이다.

이 방식을 사용할 경우 받는 쪽에스 RAW_POST_DATA 로 받아줘야 한다.


package utils
{	
	import flash.events.ErrorEvent;
	import flash.events.Event;
	import flash.events.IEventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.events.MediaEvent;
	import flash.media.CameraRoll;
	import flash.media.MediaPromise;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	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 loader:URLLoader;
		private var filename:String;
		
		public function ImageSelector()
		{
			cr = new CameraRoll();
		}
		
		public function uploadImage():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();
			filename = imagePromise.relativePath;
			
			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);
			
			loader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.BINARY;
			
			var urlString:String = "http://업로드경로.php?filename=" + filename;
			var request:URLRequest = new URLRequest(urlString);
			
			request.data = imageBytes;
			request.method = URLRequestMethod.POST;
			request.contentType = "application/octet-stream";
			loader.addEventListener(Event.COMPLETE, onUploadComplete);
			loader.addEventListener(IOErrorEvent.IO_ERROR, onUploadError);
			loader.load(request);
		}
		
		private function onUploadComplete(e:Event):void
		{
			disposeAll();
		}
		
		private function onUploadError(e:IOErrorEvent):void
		{
			disposeAll();
		}
		
		private function onBrowseCancel(e:Event):void
		{
			disposeCameraRoll();
		}
		
		private function onMediaError(e:ErrorEvent):void
		{
			disposeCameraRoll();
		}
		
		private function disposeCameraRoll():void
		{
			cr.removeEventListener(MediaEvent.SELECT, onImageSelect);
			cr.removeEventListener(Event.CANCEL, onBrowseCancel);
			cr.removeEventListener(ErrorEvent.ERROR, onMediaError);
		}
		
		private function disposeAll():void
		{
			disposeCameraRoll();
			
			loader.removeEventListener(Event.COMPLETE, onUploadComplete);
			loader.removeEventListener(IOErrorEvent.IO_ERROR, onUploadError);
		}
	}
}



받는쪽 ---------------------------------------------------------------------


if($GLOBALS['HTTP_RAW_POST_DATA']) { $filename = $_GET['filename']; //방법1. 파일로 저장 $fp = fopen('경로'.$filename, 'wb+'); fwrite($fp, $GLOBALS['HTTP_RAW_POST_DATA']); fclose($fp); //방법2. 임시파일로 생성후 사용(GD로 변환작업등 원본이 불필요한 경우) $tmpname = tempnam(sys_get_temp_dir(), 'pic'); $fp = fopen($tmpname, 'wb+'); fwrite($fp, $GLOBALS['HTTP_RAW_POST_DATA']); fclose($fp); @unlink($tmpname); }