home > AS3 : 画像のアップロード

AS3 : 画像のアップロード

January 24, 2011

ローカルから画像ファイルをアップロードする方法。

間違いやすい点として戻り値は
Event.COMPLETE ではなくて、
DataEvent.UPLOAD_COMPLETE_DATA より取得する。

JPGEncoderのライブラリーはこちらから一式DLください。


import com.adobe.images.JPGEncoder;
import flash.utils.ByteArray;
import jp.psyark.net.MultipartFormDataBuilder;

private function SelectAction():void
{
 //セレクト
 fileRef = new FileReference();
 fileRef.addEventListener( Event.SELECT, onSelectFile );
 var imagesFilter:FileFilter = new FileFilter("Images", "*.jpg");
 fileRef.browse([imagesFilter]);
}
private function onSelectFile( e:Event ):void
{
 fileRef.removeEventListener( Event.SELECT, onSelectFile );
 if(fileRef.size <= 5000000){//5M以下の場合
  fileRef.addEventListener(Event.COMPLETE, onFileLoaded);
  fileRef.addEventListener(IOErrorEvent.IO_ERROR, onFileLoadError);
  fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress);
  fileRef.load();
 }
}
//onFileLoadError
private function onFileLoadError(event:Event):void
{
 fileRef.removeEventListener(Event.COMPLETE, onFileLoaded);
 fileRef.removeEventListener(IOErrorEvent.IO_ERROR, onFileLoadError);
 fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress);
 trace("File load error");
}
//onProgress
private function onProgress(event:ProgressEvent):void
{
 var percentLoaded:Number=event.bytesLoaded/event.bytesTotal*100;
 trace("loaded: "+percentLoaded+"%");
}
//onFileLoaded
private function onFileLoaded(event:Event):void
{
 fileRef.removeEventListener(Event.COMPLETE, onFileLoaded);
 fileRef.removeEventListener(IOErrorEvent.IO_ERROR, onFileLoadError);
 fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress);
 
 var fileReference:FileReference=event.target as FileReference;
 var data:ByteArray=fileReference["data"];
 trace("File loaded");
 var movieClipLoader:Loader=new Loader();
 movieClipLoader.loadBytes(data);
 movieClipLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMCLoaderComplete);
}
//onMCLoaderComplete
private function onMCLoaderComplete(event:Event):void
{
 trace("onMovieClipLoaderComplete");
 //BitmapData
 var upppbmp:BitmapData = Bitmap(event.target.content).bitmapData;
 trace("upppbmp = "+upppbmp);
 
 //エンコードする
 var jpegup:JPGEncoder = new JPGEncoder(100);
 var byteArrup:ByteArray = jpegup.encode(upppbmp);
 
 var selecturl:URLRequest = new URLRequest();
 selecturl.url = _uploaderphp;
 var variables:URLVariables = new URLVariables();
 variables.imgupload = byteArrup;
 selecturl.method = URLRequestMethod.POST;
 selecturl.data = variables;
 
 fileRef.addEventListener(Event.COMPLETE, onUploadData);
 fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadDataHandler);
 fileRef.addEventListener(ProgressEvent.PROGRESS, onProgressUP);
 //fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorUP);
 fileRef.upload(selecturl);
}
//===================================================//
//アップロードと同時にXMLを取得する:UPLOAD_COMPLETE_DATA
//===================================================//
private function uploadDataHandler(e:DataEvent):void
{
 fileRef.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadDataHandler);
 //XML取得
 var uploaderXML:XML = new XML( e.data );
 trace("uploaderXML = "+uploaderXML);
}

WEBカメラからのキャプチャーをとる方法は下記です。

private function CameraAction():void
{
 camera = Camera.getCamera();
 if(camera != null){
  trace("使用可能なカメラあり。");
  camera.addEventListener(StatusEvent.STATUS, statusHandler);
  camera.setMode(camera_width, camera_height, 15);
  camera.setMotionLevel(10);
  camera.setQuality(0, 50);

  video = new Video(camera.width, camera.height);
  video.attachCamera(camera);
  _webcamera.addChild(video);
  video.x = -camera_width/2;
  video.y = -camera_height/2;
 }else{
  trace("使用可能なカメラがありません。");
 }
}
//statusHandler
private function statusHandler(evt:StatusEvent):void
{
 trace("camera.muted = "+camera.muted);
 if(camera.muted){
  trace("カメラへのアクセスが拒否されました。");
  trace("カメラの映像を表示するにはアクセスを許可してください。");
  Security.showSettings(SecurityPanel.PRIVACY);
 }else{
  trace("使用中のカメラ : " + camera.name);
  trace("幅x高さ : " + camera.width + "x" + camera.width);
 }
}
private function BitmapAction():void
{
 bdTmp = new BitmapData(camera_width, camera_height);
 bdTmp.draw(video);

 //エンコードする
 var jpeg:JPGEncoder = new JPGEncoder(100);
 var byteArr:ByteArray = jpeg.encode(bdTmp);
 jpgSend(byteArr);
}
private function jpgSend(ba:ByteArray):void
{
 var builder:MultipartFormDataBuilder = new MultipartFormDataBuilder("247672365515574"); //バウンダリは適当
 builder.addPart("imgupload", ba, "geee_webcam.jpg"); //JPEGエンコードされたByteArray

 //POST---imgupload
 var _uploaderphp:String = "sample.php";//アップロードするプログラム先
 JpegRequest = new URLRequest();
 JpegRequest.url = _uploaderphp;
 builder.configure(JpegRequest);

 JpegLoader = new URLLoader();
 JpegLoader.addEventListener(Event.COMPLETE, ImageSoushin);
 JpegLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHD);
 JpegLoader.load(JpegRequest);
}
private function ioErrorHD(e:IOErrorEvent):void
{
 trace("ioErrorHD");
}
private function ImageSoushin(eventObject:Event):void
{
 trace("ImageSoushin");
 JpegLoader.removeEventListener(Event.COMPLETE, ImageSoushin);
 JpegLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHD);

 //XML取得
 var uploaderXML:XML = new XML( eventObject.target.data );
 trace("uploaderXML = "+uploaderXML);
}


ブックマークする hatena del.ico.us


Comments

Post a Comment






Remember personal info