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

Permalink | Comments (0)

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


Permalink | Comments (0)

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


Permalink | Comments (0)