2015. 2. 5. 16:59
모바일(앨범)에서 이미지 업로드(CameraRoll사용)
2015. 2. 5. 16:59 in 팁&테크/ActionScript3
임시파일 생성없이 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); }