2015. 2. 5. 11:22
모바일(앨범)에서 이미지 업로드(CameraRoll사용, 임시파일 생성방식)
2015. 2. 5. 11:22 in 팁&테크/ActionScript3
임시파일 생성보다는 다이렉트로 올리는게 더 리소스를 작게 사용하나 참고소스로 남겨 둠
받는 쪽에서는 일반적인 파일 업로드 방식(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); } } }