home > January 2011
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);
}
Tweet
AS3 : CASA Framework
January 19, 2011
以下よりCASAのAS3ライブラリーをダウンロードします。
http://svn.as3.casalib.org/dev/
めんどくさい人はこちらから一式DLください。
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.utils.*;
import org.casalib.load.*;
import org.casalib.events.*;
public class CasaSampleCls
{
private var _imgURLs:Array = ["data/samp1.jpg", "data/samp2.jpg", "data/samp3.jpg", "data/samp4.jpg", "data/samp5.jpg"];
private var _groupLoad:GroupLoad;
public function ActionCls():void
{
//グループロードする
startLoadGroup();
}
private function startLoadGroup():void
{
_groupLoad = new GroupLoad();
_groupLoad.addEventListener(LoadEvent.COMPLETE, onCompleteGroupLoad);
var len:int = _imgURLs.length;
for (var i:int = 0; i < len; i++)
{
var imageLoad:ImageLoad = new ImageLoad(_imgURLs[i]);
imageLoad.addEventListener(IOErrorEvent.IO_ERROR, onErrorImageLoad);
_groupLoad.addLoad(imageLoad);
}
//スタート
_groupLoad.start();
}
private function onErrorImageLoad(e:IOErrorEvent):void
{
trace("onErrorImageLoad");
var imgs:Array = _groupLoad.completedLoads; //ロードが成功した画像
var len:int = imgs.length;
for (var i = 0; i < len; i++)
{
if (!imgs[i].loaded)
{
//ロードが失敗した画像のかわりにエラー画像のURLを入れる。
_imgURLs[i] = "data/error.jpg";
}
}
//もう一度グループロードする
startLoadGroup();
}
private function onCompleteGroupLoad(e:LoadEvent):void
{
trace("onCompleteGroupLoad");
var len:int = _groupLoad.loads.length;
for (var i:int = 0; i < len; i++)
{
var img:Bitmap = _groupLoad.loads[i].contentAsBitmap; //ビットマップにキャストする。
img.smoothing = true;
img.x = 0;
img.y = 0;
addChild(img);
}
}
}
参考サイトはこちら
http://d.hatena.ne.jp/yoshidam/20100402/1270202619
Tweet
AS3 : SWFAddress
progressinを使わず、AS3でSWFAddressを使う方法。
ライブラリは下記より最新のものをDLください。
http://www.asual.com/swfaddress/
イベントの種類
・URLを変更したい場合
SWFAddressEvent.CHANGE
・ページが変わったというイベントが実行される場合
SWFAddressEvent.INTERNAL_CHANGE
・ブラウザの戻るボタンや進むボタンなど、FLASH以外での制御が行われた場合
SWFAddressEvent.EXTERNAL_CHANGE
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import SWFAddress;
import SWFAddressEvent;
public class SwfaddressCls
{
private var _defaultTitle:String;
public function SwfaddressCls():void
{
//SWFAddress
SWFAddress.addEventListener(SWFAddressEvent.INIT, initHandler);
}
public function clickHandler(_swfname:String):void
{
SWFAddress.setValue( _swfname );
SWFAddress.setTitle( _swfname );
switch(_swfname)
{
case "sample1":
trace("sample1");
break;
case "sample2":
trace("sample2");
break;
case "resetStatus()":
SWFAddress.resetStatus();
break;
}
}
private function initHandler(event:SWFAddressEvent):void
{
SWFAddress.removeEventListener(SWFAddressEvent.INIT, initHandler);
trace("------------------------------------");
trace("parameterNames: " + event.parameterNames);
trace("parameters: " + event.parameters);
trace("path: " + event.path);
trace("pathNames: " + event.pathNames);
trace("target: " + event.target);
trace("type: " + event.type);
trace("value: " + event.value);
trace("getBaseURL: " + SWFAddress.getBaseURL());
trace("getHistory: " + SWFAddress.getHistory());
trace("getParameter: " + SWFAddress.getParameter("unko"));
trace("getParameterNames: " + SWFAddress.getParameterNames());
trace("getPath: " + SWFAddress.getPath());
trace("getPathNames: " + SWFAddress.getPathNames());
trace("getQueryString: " + SWFAddress.getQueryString());
trace("getStatus: " + SWFAddress.getStatus());
trace("getStrict: " + SWFAddress.getStrict());
trace("getTitle: " + SWFAddress.getTitle());
trace("getTracker: " + SWFAddress.getTracker());
trace("getValue: " + SWFAddress.getValue());
trace("------------------------------------");
_defaultTitle = SWFAddress.getTitle();
SWFAddress.addEventListener(SWFAddressEvent.CHANGE, changeHandler);
SWFAddress.addEventListener(SWFAddressEvent.EXTERNAL_CHANGE, externalChangeHandler);
SWFAddress.addEventListener(SWFAddressEvent.INTERNAL_CHANGE, internalChangeHandler);
}
private function changeHandler(event:SWFAddressEvent):void
{
trace("------------------------------------");
// パラメータのキー名一覧を配列で取得
trace("parameterNames: " + event.parameterNames);
// パラメータ全てを連想配列(Object 型)で取得
trace("parameters: " + event.parameters);
// SWFAddress の path 文字列(#以降の文字列)を取得する
trace("path: " + event.path);
// SWFAddress の path を配列で取得
trace("pathNames: " + event.pathNames); trace("target: " + event.target);
trace("type: " + event.type);
trace("value: " + event.value);
switch(event.value)
{
case "/sample1":
trace("sample1");
Action(sample1);
break;
case "/sample2":
trace("sample2");
Action(sample2);
break;
}
}
private function externalChangeHandler(event:SWFAddressEvent):void
{
trace("------------------------------------");
// パラメータのキー名一覧を配列で取得
trace("parameterNames: " + event.parameterNames);
// パラメータ全てを連想配列(Object 型)で取得
trace("parameters: " + event.parameters);
// SWFAddress の path 文字列(#以降の文字列)を取得する
trace("path: " + event.path);
// SWFAddress の path を配列で取得
trace("pathNames: " + event.pathNames);
trace("target: " + event.target);
trace("type: " + event.type);
trace("value: " + event.value);
}
private function internalChangeHandler(event:SWFAddressEvent):void
{
trace("------------------------------------");
// パラメータのキー名一覧を配列で取得
trace("parameterNames: " + event.parameterNames);
// パラメータ全てを連想配列(Object 型)で取得
trace("parameters: " + event.parameters);
// SWFAddress の path 文字列(#以降の文字列)を取得する
trace("path: " + event.path);
// SWFAddress の path を配列で取得
trace("pathNames: " + event.pathNames);
trace("target: " + event.target);
trace("type: " + event.type);
trace("value: " + event.value);
}
}
}
参考サイトはこちら
http://feb19.jp/blog/archives/000181.php
Tweet