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);
}