=================================
=================================
=================================
출처: http://snipplr.com/view/4487/as3-sending-data-using-post/
AS3: Sending Data using POST
var bg_mc:MovieClip = new MovieClip();
bg_mc.graphics.beginFill(0xFF0000, 1);
bg_mc.graphics.drawRect(0, 0, 100, 100);
bg_mc.graphics.endFill();
bg_mc.x = stage.stageWidth / 2 - bg_mc.width / 2;
bg_mc.y = stage.stageHeight / 2 - bg_mc.height / 2 ;
bg_mc.buttonMode = true;
bg_mc.addEventListener(MouseEvent.MOUSE_DOWN, visitSite);
addChild(bg_mc);
function visitSite(e:MouseEvent):void {
var url:String = "http://api.flickr.com/services/rest/";
var request:URLRequest = new URLRequest(url);
var requestVars:URLVariables = new URLVariables();
requestVars.api_key = "3c84c0ca7f9ae17842a370a3fbc90b63";
requestVars.method = "flickr.test.echo";
requestVars.format = "rest";
requestVars.foo = "bar";
requestVars.sessionTime = new Date().getTime();
request.data = requestVars;
request.method = URLRequestMethod.POST;
var urlLoader:URLLoader = new URLLoader();
urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.addEventListener(Event.COMPLETE, loaderCompleteHandler, false, 0, true);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler, false, 0, true);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
for (var prop:String in requestVars) {
//trace("Sent: " + prop + " is: " + requestVars[prop]);
}
try {
urlLoader.load(request);
} catch (e:Error) {
trace(e);
}
}
function loaderCompleteHandler(e:Event):void {
var responseVars = URLVariables( e.target.data );
trace( "responseVars: " + responseVars );
}
function httpStatusHandler( e:HTTPStatusEvent ):void {
//trace("httpStatusHandler:" + e);
}
function securityErrorHandler( e:SecurityErrorEvent ):void {
trace("securityErrorHandler:" + e);
}
function ioErrorHandler( e:IOErrorEvent ):void {
//trace("ORNLoader:ioErrorHandler: " + e);
dispatchEvent( e );
}
=================================
=================================
=================================
// URL 로드 클래스 작성
package utils
{
import flash.errors.IOError;
import flash.events.*;
import flash.net.*;
import flash.system.*;
import flash.utils.ByteArray;
import org.osmf.utils.URL;
public class CURLLoader
{
public static
const TYPE_SYSTEM_MSG: int = 0;
public static
const TYPE_DATA: int = 1;
public static
const TYPE_SYSTEM_ERROR: int = 2;
//http://open.cyberoro.com/gibo/201201/120110-wonik-kiwonkim.sgf
private
var _callback: Function;
public
function CURLLoader()
{
}
public
function load(url: String, cb: Function): void
{
System.useCodePage = true;
_callback = cb;
var l: URLLoader = new URLLoader();
l.addEventListener(Event.COMPLETE, completeHandler);
l.addEventListener(Event.OPEN, openHandler);
l.addEventListener(ProgressEvent.PROGRESS, progressHandler);
l.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
l.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
l.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
var request: URLRequest = new URLRequest(url);
try
{
l.load(request);
} catch (e: IOError)
{
trace(e.message);
}
}
public
function load_post(url: String, val: URLVariables, cb: Function): void //POST
{
System.useCodePage = true;
_callback = cb;
var l: URLLoader = new URLLoader();
l.addEventListener(Event.COMPLETE, completeHandler);
l.addEventListener(Event.OPEN, openHandler);
l.addEventListener(ProgressEvent.PROGRESS, progressHandler);
l.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
l.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
l.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
var request: URLRequest = new URLRequest(url);
//request.data = val;
request.method = URLRequestMethod.POST;
//var variables:URLVariables = new URLVariables();
//variables.someText = "몇개의 정보를 보냄";
//variables.someNumber = 26.2;
//request.data = variables;
trace("sendToURL: " + request.url + "?" + request.data);
try {
//sendToURL(request);
l.load(request);
} catch (e: Error) {
// handle error here
}
}
private
function completeHandler(event: Event): void
{
var l: URLLoader = URLLoader(event.target);
l.dataFormat = "text";
var s: String = l.data;
_callback.call(this, s, TYPE_DATA);
}
private
function openHandler(event: Event): void
{
trace("openHandler: " + event);
_callback.call(this, "openHandler: " + event, TYPE_SYSTEM_MSG);
}
private
function progressHandler(event: ProgressEvent): void
{
trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
_callback.call(this, "progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal, TYPE_SYSTEM_MSG);
}
private
function securityErrorHandler(event: SecurityErrorEvent): void
{
trace("securityErrorHandler: " + event);
_callback.call(this, "securityErrorHandler: " + event, TYPE_SYSTEM_ERROR);
}
private
function httpStatusHandler(event: HTTPStatusEvent): void
{
trace("httpStatusHandler: " + event);
_callback.call(this, "httpStatusHandler: " + event, TYPE_SYSTEM_MSG);
}
private
function ioErrorHandler(event: IOErrorEvent): void
{
trace("ioErrorHandler: " + event);
_callback.call(this, "ioErrorHandler: " + event, TYPE_SYSTEM_ERROR);
}
}
}
//메인 데이터 클래스
package
{
import utils.CURLLoader;
import flash.display.InteractiveObject;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.text.TextField;
import flashx.textLayout.formats.Float;
import utils.CStringTokenizer;
[SWF(width = 700, height = 525, backgroundColor = 0xFFFFFF)]
//[SWF(backgroundColor=0x000000)]
public class TESTNetData extends Sprite
{
public static
var _ParameterStr: String = "";
public
var DATA_URL: String = "http://topia.cyberoro.com/lecture/view_action.asp";
public static
var _SCREEN_W: int = 700;
public static
var _SCREEN_H: int = 525;
public static
var _bg: Sprite = null;
public static
var _textView: Sprite = null;
public static
var _text1: TextField = null;
public
function TESTNetData()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.fullScreenSourceRect = new Rectangle(0, 0, _SCREEN_W, _SCREEN_H);
_bg = new Sprite();
_bg.x = 0;
_bg.y = 0;
_bg.scaleX = 1;
_bg.scaleY = 1;
_bg.width = _SCREEN_W;
_bg.height = _SCREEN_H;
_bg.graphics.beginFill(0x505050);
_bg.scaleX = 1;
_bg.scaleY = 1;
_bg.graphics.drawRect(0, 0, _SCREEN_W, _SCREEN_H);
addChild(_bg);
_textView = new Sprite();
_textView.buttonMode = true;
_textView.x = 5;
_textView.y = 5;
_textView.width = 0;
_textView.height = 0;
_textView.graphics.beginFill(0xFF00FF);
_textView.scaleX = 1;
_textView.scaleY = 1;
_textView.graphics.drawRect(0, 0, 100, 525);
_text1 = new TextField();
_text1.width = 100;
_text1.height = 525;
_textView.addChild(_text1);
addChild(_textView);
loadUrl();
}
public
function loadUrl(): void
{
//데이터 값을 받으면 값을 보내는 asp 나 php 등등 작성한다.
var url: String = DATA_URL + "?" + "uid=" + test + "&steps=" + 1 + "&kang=" + 1 + "&kind_div=" + 1;
loadProbUrl(url);
}
public
function loadProbUrl(url: String): void // url - 로드URL, URL을 데이터로 로드할것인가 유무
{
var d: CURLLoader = new CURLLoader();
d.load_post(url, null,
function onCallback(data: String, type: int): void
{
if (type == CURLLoader.TYPE_DATA) //연결된 데이터 스트링
{
var nextNo: int = 0;
var prob: String = "";
_text1.text = data;
} else if (type == CURLLoader.TYPE_SYSTEM_ERROR) //에러데이터
{
_text1.text = data;
}
});
}
public
function destroy(): void
{
//삭제....처리..
}
}
}
=================================
=================================
=================================
출처: http://haullab.tistory.com/439
오늘은, 조금 더 재미있게 해 봅시닷!
요렇게 해줍시다.
이것의 설명은 조금 후에 하겠습니다.
흐음.. 이렇게 한다면 테스트가 출력됩니다.
일단, 플래시부터 설명하겠습니다.
7줄에서 저희는 보내는 방법을 결정합니다.
저희는 POST방법을 택했죠.
이것은 알 것입니다.
그런데,
10~12줄에서는 뭘 했을까요?
10줄에서는 URLVariables 인스턴스를 만들고,
11줄에서는 그것의 a속성에 "테스트"를 대입했습니다.
그리고 12줄에서는 urlrequest.data=urlvariables;라고 했습니다.
이게 무슨뜻이냐, 하면,
의역해서 말하자면, php로 변수를 넘겨줄 때에, a변수에는 "테스트"라는 값을 넘겨줬다 라는 의미입니다.
의역이 좋군요....
자, 그렇다면, php문에서 $a=$_POST['a'];
는 무엇을 의미할까요?
네, $a변수는, 저희가 플래시에서 php에 전달해준 a변수에 들어간 값이 된다는 것입니다.
$_POST['a']에서의 POST는, 전달되는 형식으로,
지정해 줘야 됩니다.
$_POST['a']에서의 a는, php에 전달해준 a 변수라는 뜻입니다.
참 쉽죠?
그렇다면, 이제 결과를 봅시다.
또한, 만약 $POST['a']를 하기 싫다면,
php.ini파일의 register_globals를 on으로 해주면 되긴 합니다만
저는 귀찮고 이런저런 관계로 이렇게 안하도록 하겠습니다.
추신 : 보내는 방법에는 POST에만 있는것은 아닙니다.
=================================
=================================
=================================
출처: http://cafe.naver.com/amfphpsamo/75
3.0에서 그 방식이 변동된것중 가장 많이 사용하고있는 것중 하나가 GET 또는 POST로 주고받는 데이터일것이다.
모션이 아닌 액션스크립터들에게는 필수이다.
액션스크립터들도 주로 다루는 영역에 따라서 인터넷 어플리케이션인지에 따라 그 방향이 틀려지는듯한 느낌이든다.
모든것들 다 할수있다면 좋겠지만 시간은 한정되있다보니 여러가지를 한꺼번에 하는것이 쉽지는 않다.
그중에 인터넷 어플리케이션쪽을 필자가 주로하다보니 계속 통신에 관련된부분을 먼저 보게되는데 양해해 주시기 바랍니다.
이번시간에는 어떻게 서버로부터 데이터를 주고받는가하는것이다.
XML방식,GET,POST,SOCKET,REMOTING 등 상당한 데이터를 지원하고있기때문에
그 선택의 폭이 넓어졌다.
이번에는 가장 기본방식이라 할수있는 GET,POST 방식에 대해 알아보기로한다.
먼저 가장 기초적으로 GET 과 POST에 대해 간단히 설명하겠다.
도데체 GET,POST방식 두가지가 왜 틀리고 어느때 사용하는지 궁금하셨던분들도 있을것이다.
일단 GET방식을 보면 아래와같은 특징이 존재한다.
1. http://test.com/test.jsp?name=바보&coin=100
주소창에 저런식으로 넘나드는것을 많이 봤을것이다.
저기서 name 은 서버로 전달하는 변수명이고 '바보'는 name 변수에대한 데이터이다.
이런식으로 & 로 구분해서 연속으로 전달할수있다.
그러므로 coin 변수를 100의 값을 담아 전달하고있는것이다.
2. 간단한 정보를 전송할때 사용한다.
3. 그러므로 글자수가 255자로 제한되어있다.
4. 서버로 전달되는 데이터도 원하는 데이터이외데 다른기본데이터가 같이 전달된다.
5. 주소창으로 전달되므로 데이터 조작을 할 가능성이 있다.
6. 사용이 간편하다
등등
POST 방식
1.헤더로 인코딩되어 전송된다.
2.처리속도가 늦어진다.
3.큰 크기의 데이터를 전송할수있다.
등등
딱봤을땐 POST방식이 좋을것같다. 실제로도 요즘은 POST방식을 주로 사용한다.
일단 데이터의 양이 많아졌기때문에 주로쓰게되며 서버의 성능과 네트워크의 속도 증가로인해
작은데이터들도 POST방식으로 많이 쓰고있는것이 사실이다.
그러나 가장 최적의 퍼포먼스를 구현하기위해서는 이 두가지를 병행해서 적절한 방법으로 사용하는것이 좋다.
보안에 민감할 필요가 없고 규모가 작은 데이터들을 처리할때는 GET방식으로 처리하게되면
서버에서의 반응속도가 빠르기때문에 상당한 효과를 누릴수있다.
인터넷에서의 속도의 증가는 곧 사용자를 더 쾌적하게 잡아둘수 있다는 것이므로 무시할수많은 없는 방법이다.
GET은 헤더를 디코딩하지 않기때문에 속도가 빠르지만 그내용이 보인다는것이 문제이므로
적당한 사용방법이 필요하다. 플래시는 브라우져성격으로 쓴다면 화면구성이 기존브라우져보다
더 인터렉티브하고 반응속도가빠른 어플리케이션을 만들수있다.
하지만 서버와의 반응속도가 느리다면 그 잇점을 전체적으로 누리는것에 대한 의미가 떨어진다.
GET방식을 플래시에서도 적절하게 섞어쓴다면 플래시의 속도와 서버의 속도로 마치 로컬에서 실행되는것 같은 느낌을 가지게 할수있다.
이것은 곧 웹2.0시대에 유저와 서로 반응하는 환경에서 그 우위를 점할수있다는것이 된다.
소잡는 칼로 닭을 잡을 필요가 없듯 닭잡는칼로 소를 잡을수없다.
예제 1>
function sendData( ):void {
var request:URLRequest = new URLRequest( "test.jsp" );
var variables:URLVariables = new URLVariables( );
variables.someText = "몇개의 정보를 보냄";
variables.someNumber = 26.2;
request.data = variables;
sendToURL( request );
}
예제2 >-------------------------------------
package {
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.sendToURL;
public class SendToURLExample extends Sprite {
public function SendToURLExample() {
var url:String = "http://www.yourDomain.com/application.jsp";
var variables:URLVariables = new URLVariables();
variables.sessionId = new Date().getTime();
variables.userLabel = "Your Name";
var request:URLRequest = new URLRequest(url);
request.data = variables;
trace("sendToURL: " + request.url + "?" + request.data);
try {
sendToURL(request);
}
catch (e:Error) {
// handle error here
}
}
}
}
위의 예제 처럼 공통된 사용 규격이 있다.
먼저 sendToURL(request:URLRequest):void
에 인자값으로 전달하기위한 URLRequest가 있어야하기때문에 해당 인스턴스를 만들고
이 URLRequest의 인스턴스안에서는 data라는 속성값에 넘겨줄 변수들을 담고있는 URLVariables 의 인스턴스를
예제와같이 넘겨줘야한다.
URLVariables 인스턴스는 호출할 URL에 대한 참조를 생성될때 받은 주소로 가지게되고 이것을 다시 URLRequest가
참조하기때문에 구조가 연속된 구조를 가지게된다.
제일 아래에는 지난시간중에 살펴본 럭셔리한 디버깅의 try catch로 에러가 발생했을때 그 처리를 하기위한
방법을 쓰고있다. 두번째 예제는 플래시 CS의 리퍼런스 예제이므로 참고하기 바란다.
다음 살펴볼건 navigateToURL 이다.
public function navigateToURL(request:URLRequest, window:String = null):void
인자값으로 받는것이 마찬가지로 URLRequest 이고 두번재인자는 윈도우가 어떤건지 지정하는 스트링이다.
- "_self" 현재 윈도우
- "_blank" 새 윈도우
- "_parent" 부모 윈도우
- "_top" 현재윈도우의 최상위 부모 윈도우
이렇게 4개의 모드로 윈도우를 열수있다.
윈도우를 연다는것은 브라우져를 연다는것인데 새창을 다루는것임을 알수있다.
package { import flash.display.Sprite; import flash.net.navigateToURL; import flash.net.URLRequest; import flash.net.URLVariables; public class NavigateToURLExample extends Sprite { public function NavigateToURLExample() { var url:String = "http://www.adobe.com"; var variables:URLVariables = new URLVariables(); variables.exampleSessionId = new Date().getTime(); variables.exampleUserLabel = "Your Name"; var request:URLRequest = new URLRequest(url); request.data = variables; try { navigateToURL(request); } catch (e:Error) { // handle error here } } } }
예제에서도 알수있듯이 sendToURL 과 성격이 비슷하지만 윈도우를 지정할수있다는데 더 장점이 있다.
navigateToURL( request, "_blank" );
이런식으로 말이다.
일단 우리가 알려고하는것은 get과 post인데 지금 해온것들에서의 방법으로 볼때 그것을 지정하는것은
인스턴스에 상속된 어떤 속성에 그것을 지정하면된다는것이다.
request.method = URLRequestMethod.POST;
와
request.method = URLRequestMethod.GET;
이 바로그것이다.
위의 예제에서 request.data에는 변수 데이터를 집어넣지만
request.method 에는 전달 방식을 지정한후에 최종 호출을 하는것이다.
순서를 잊지말고 잘 지켜야된다. 다음은 최종적으로 종합예제를 본다.
package {
import flash.display.*;
import flash.text.*;
import flash.events.*
import flash.net.*;
public class SendAndLoadExample extends Sprite {
private var _output:TextField;
public function SendAndLoadExample( ) {
initializeOutput( );
sendData( );
}
private function initializeOutput( ):void {
_output = new TextField();
_output.width = stage.stageWidth;
_output.height = stage.stageHeight;
addChild( output );
}
private function sendData( ):Void {
var request:URLRequest = new URLRequest( "process.cfm" );
var variables:URLVariables = new URLVariables( );
variables.method = "getProductDetail"
variables.productId = 2;
request.data = variables;
var loader:URLLoader = new URLLoader( );
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener( Event.COMPLETE, handleComplete );
loader.load( request );
}
private function handleComplete( event:Event ):void {
var loader:URLLoader = URLLoader( event.target );
_output.text = "Name: " + loader.data.name + "\n"
+ "Description: " + loader.data.description;
}
}
}
갑자기 뜬금없이 배우지도 않은 URLLoader 가 튀어나왔다. 도데체 뭐하는 녀석일까
이 클래스는 URLVariables 와 함께 같은 종류의 일을 처리한다.
이녀석은 URL로 텍스트,바이너리 데이터, 또는 URL-encode 된 데이터를 다운로드할때 쓰인다.
이녀석은 텍스트파일을 다운로드하거나 XML 등을 컨트롤하기에 적합하므로
상당히 유용하게 쓸수있다.
왜냐면 이녀석의 이벤트 핸들링 모델이 액션스크립트 3.0의 구조에 적합하게설계되어있기때문이다.
이벤트가 발생했을때 httpStatus,ioError,open,progress,과 securityError 같은 이벤트를
처리할수있게 해주기때문에 종합선물세트와 비슷하다.
2.0에서는 LoadVars.onData , LoadVars.onHTTPStatus , LoadVars.onLoad 이벤트에서
처리를 했었지만 더많은 기능의 향상이 있으므로 이제 이것을 쓰는것을 권장한다.
이것을 설명하면서 중요한기능 중 하나가 dataFormat이다.
- URLLoaderDataFormat.BINARY--URLLoader.data 데이터를 bytearray형식으로 처리
- URLLoaderDataFormat.TEXT--텍스트 스트링형식으로 처리
- URLLoaderDataFormat.VARIABLES--인코딩된 URL 데이터로 처리
위의 오렌지색에서는 3번째 인코딩된 URL 데이터로 처리하고있다.
주로 get이나 post는 이 처리를 많이 하게될것이다.
일반 텍스트 파일을 불러와서 보여줄때에는 TEXT , 그리고 다른 실행파일같은경우 BINARY 로 처리할수있다.
한가지 주의해야될 사항이 있다.
위에서 빨간색으로된부분의 data속성을 정의할경우에는 호출하는 url에게 변수값을 전달하게되는데
이때 해당 url로 부터 응답이 없을경우 작동이 멈추게된다.
만약 전달사항이 없을경우는 data를 설정하면안된다.
Error #2044: 처리되지 않은 ioError입니다. text=Error #2032: 스트림 오류입니다.
라는 오류가 나기때문이다.
전달사항이 없다는것은 참조만하는경우이므로 가져다 쓸때만 써야하기때문에 주의를 기울여야한다.
=================================
=================================
=================================
출처: http://blog.naver.com/karasmonster?Redirect=Log&logNo=149863916
웹쪽은 경험이 참 부족한 분야 중 하나인데... ;ㅁ;
오늘은 HTTP request header 에 커스터마이징 된 값을 넣어서 요청할 수 있느냐는
다른 부서의 질문이 있었다.
나에게는 외계어. 졸지에 여기저기 이것저것 돌아다니면 지식 습득 결과
내용은 이해했으며,
1. 기본 헤더값은 수정 불가.
2. 보안 문제상 수정된 헤더를 보내고 싶으면 전송방식은 POST를 쓸 것.
3. allow-http-request-headers-from 이 허용된 crossdomain.xml 파일을 설정할 것.
와 같은 조건이 충족되어야 한다고 한다. 하여...
URLRequest 객체를 아래와 같이 설정하고 (한글 부분은 당연히 임시 값.)
돌렸다.
var request:URLRequest = new URLRequest();
request.url = "특정url";
var requestHeader:URLRequestHeader = new URLRequestHeader("명칭", 값);
request.requestHeader.push(requestHeader);
request.method = URLRequestMethod.POST;
크롬 개발자 도구로 Network 를 확인하는데...
분명 POST방식이건만 GET이라고 한다.
물론 header도 찾을 수 없고. 잠은 오고. 하기도 싫고..(응?)
그러다 문득
http://www.gorbster.net/blog/archives/9
이 분의 글을 발견
request내에 전달하는 값이 없으면 POST를 플래시가 지 맘대로 GET으로 바꿉니다...-_-!!
오메...
그리하여. 더미값을 집어넣으니 이제야 잘 보여진다 ㅠㅠ
아래는 더미 내용
var someVar:URLVariables = new URLVariables();
someVar.dummyData = "dummyValue";
request.data = someVar;
결국,
조건은 마지막에 하나 추가되어야 한다.
4. URLRequest내에 URLVariables 값을 필히 추가할 것.
저처럼 헤매는 분들이 없으시길....
오늘도 꾸역꾸역 헤매는
나는야 이름만 개발자 ;ㅁ;
=================================
=================================
=================================
출처: http://sosiers.tistory.com/9
//------------------------------------------------------
** 외부파일 읽어들이기...!!
외부파일 :
텍스트, 이미지
flash5 loadVariablue() loadMoive()
AS1.0 : LoadVars, MovieClipLoader()
AS3.0 : URLLoader, Loader
** 외부파일 연동....
동기식 VS 비동기식
- 동기식 : Synchronous{싱크로너스} --> {싱크로나이징} --> 보조를 맞춘다..!!
--> 잘하는 사람이.. 못하는 사람을 배려{기다림} :::: 기다림...!!!!
- 비동기식 : Asynchronous ::: 기다리지 않는다..!!!
// 프로그램은 동기식 vs 비동기식 ??
----> 프로그램은 대부분 동기식으로 동작....!! ::: 기다려준다...!!
==> 컴퓨터가 빠르니까... 금방 처리하므로.. 기다려준다..!!
==> 플래시도 동기식으로 동작한다..!!
--> 단, 외부와의 연동은... {{{ 비동기 }}}로 동작한다..!!
외부 이미지 불러오기
외부 텍스트 불러오기
function AAA()
{
trace("AAA");
BBB();
trace("AAA");
}
function BBB()
{
trace("BBB")
}
AAA();
//-----------------------------------------------------
// AS1.0
_mc1 = new MouveClipLoader();
this.onLoadInit = function(){
//도착하면 할 일..
};
_mc1.addListener(this);
_mc1.loadClip("aaa.jpg",screen);
//--------------------------------------------------------
_lv = new LoadVars();
_lv.onLoad = function(){
};
_lv.sendAndLoad("aaa.php",_lv, "post");
//// 비동기식 코딩.
데이터 관리 객체생성
데이터가 도착하면 할 일 정하기
데이터 호출
var xmlLoader:XMLLoader = new XMLLoadder();
xmlLoader.addEventListener(XMLloaderEvent.COMPLETE, onComplete);
xmlLoader.load("aaa.xml");
function onComplete(e:XMLLoaderEvent):void
{
}
//-------------------------------------------------------------
var imgLoader:ImgLoader = new ImgLoader();
imgLoader.addEventListener(ImgLoaderEvent.COMPLETE, onComplete);
imgLoader.load("aaa.jpg");
//-----------------------------------------------------------
AS3.0에서 모든 요청은 URLRequest 로 한다..!!
Request 는 중요하지만, Response 는 { 받은 데이터 } 만 의미있으므로, URLRequest 객체만 있다.
URLRequest : 주문시에 주문할 주소, 여러가지 데이터 { 집주소, 금액, 개수..} 타입,GET/POST,...
Client --------------( request:요청 )------------> Server
<-------------( response:응답 )------------
//---------------------------------------------------
오류처리 :
동기식 오류처리
try{
}catch(e:Event){
}
비동기식 오류처리
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onError);
//-------------------------------------------
공부방식 : 내장객체의 이해..!!
내장객체 설명 --> 사용상의 문제점.. --> 해결책...
URLLoader
URLRequest
//-------------------------------------------
//1. 객체 생성
var xmlLoader:XMLLoader = new XMlLoader();
//2. 이벤트 등록
xmlLoader.addEventListener();
//3. 호출
xmlLoader.load("./aaa/data.xml");
//---------------------------------------------
플래시가 동기식으로 동작.. { 내부에서는..}
// 동기식이지만, 최대로 .. 15초까지 기다려준다..!!
// 15초 초과 Error..!!
보안
// 삼성생명 : 3DES, DES==> AES {SEED}
// 일반적으로는 DES, AES 정말 빠르다..!! 플래시로 포팅된 DES가 좀 느림
//DES 알고리즘 안에. byte 단위로 접근 : 한자리수면 앞에 "0"
3 --> 03 :::
고객 데이터가 .. 1M ---> 실제적으론 3M
for(300만){
if(){
}
}
for(var i:int=0;i<100000000; i++){
var sp:Sprite = new Sprite();
addChild(sp);
}
trace("하하하");
//--------------------------------------
var timer:Timer = new Timer(50, 200);
timer.addEventListener( TimerEvent.TIMER , onTime)l
timer.start();
function onTime(e:TimerEvent):void
{
//1000건이나 500건 단위로 잘라서 for문
for(var i:int=0; i<1000; i++){
//액션
}
}
//--------------------------------------------
사용자 이벤트 정의 : Event를 상속 받아서.. 원하는 정보를 담을 수 있는
사용자 정의 이벤트를 만들어서 전달하자..!!
이벤트 :: 정보 ..!! : "어떤 사건이 발생했다"라는 Notice + "사건의 상세정보"
완전한정보
불이야 : type
말하는 이 : target
듣는이 : currentTarget
부가정보 : { 어디서, 언제 }
:: XMLLoader : 외부와의 통신 ---> 비동기.. 호출..!! <-- 최소 코딩 3줄
클래스를 제작할 때..!!
{URLLoader, URLRequest}
1. 내장클래스에 대해서.. 완벽히 숙지..!!{정말 클래스를 따로 만들 필요가 있을까??}
--> 내장 클래스 어떻게 공부? 1. 도움말, 2.CooK book
2. 내장클래스의 문제점 파악!!
3. 문제점을 해결한,{ 쓰기 쉬운, 분석하기 쉬운 } 클래스 만들기.. --> 팔수 있는 클래스!!
var xmlLoader:XMLLoader = new XMLLoader();
xmlLoader.addEventListener(XMLLoaderEvent.COMPLETE , onComplete);
xmlLoader.load("aaa.xml");
function onComplete(e:XMLLoaderEvent):void
{
e.data
}
주인 집사 일꾼 <--------{ has a 관계의 코딩..!!} : 위임!!
주인.addEventListener( 집사Event.COMPLETE, );
=================================
=================================
=================================
출처: http://cafe.naver.com/udone/162
로컬자원을 서버에 전송하기 위해 우리는 FileReference Class를 사용하면 된다.
FileReference로FileReference로 파일을 서버에 전송하는 방법은 많이 공개가 되어 있다.
알다시피 FileReference의 browse()함수를browse()함수를 호출한 뒤, select 이벤트가 발생시 upload() 함수를 이용하여 선택한 로컬자원을 서버로서버로 보낸다.
서버에서는 아주 단순하게 서버 임시 저장소에 저장된 파일을파일을 원하는 곳에 복사하기만 하면 된다.
php의 경우 move_uploaded_file() 메소드를 사용하면사용하면 되겠다.
그럼 Flex 시행도중 캡쳐한 화면을 저장하는 경우에도 위와 같은같은 방법으로 저장이 가능할까?
답은 "된다"
나는 예전에 ImageSnapshotImageSnapshot 클래스를 이용해 base64로 변환해서 서버로 전송한 뒤에 base64를 decode하여 저장하는 방법에방법에 대해서 언급한적이 있다. (http://blog.jidolstar.com/301 참고)
이 방법의 단점은 이미지가 큰 경우경우 base64로 encode, decode 하는 과정에서 서버성능 및 클라이언트 성능에 따라 속도속도 및 부하에 영향을 준다. 그러므로 이 방법으로는 PNGEncoder 및 JPGEncoder로 PNG,PNG, JPG 파일 형식에 맞는 데이타를 만들었다고 해도, FileReference와 같이 데이타를 전송을전송을 할 수 없었다.
하지만 Google을 열심히 돌아다녔다니 이 문제점에 대한대한 해결의 실마리를 찾을 수 있었다.
(역시 Google!!!)
간단히 방법을 요약하자면요약하자면
화면을 BitmapData로 만들어 PNGEncoder나 JPGEncoder를 이용하여 encode한 다음, 그 결과값인결과값인 byteArray값을 서버에 전송한다. 전송된 데이타는 FileReference에서 upload()을 이용해 보낸 파일을 저장할때와저장할때와 동일하게 저장하면 되겠다.
1.1. BitmapData로 캡쳐해라.
아래 target은 캡쳐할 UIComponent와UIComponent와 같은 DisplayObject 객체이다.
BitmapData로 캡쳐
var bitmapData:BitmapData = new BitmapData(target.width, target.height, true, 0xFFFFFF);
var drawingRectangle:Rectangle = new Rectangle(0, 0, target.width, target.height);
bitmapData.draw(target, new Matrix(), null, null, drawingRectangle, false);
단, BitmapData를 이용해서 화면을 캡쳐할 대상이 외부 동영상이나 사진같은사진같은 거라면 crossdomain.xml 에 대한 check가 있어야한다. 컨텐츠 로드시 checkPolicyFile 속성을 속성을 true로 설정할 필요가 있겠다.
그리고 2880px 이상의 크기는 BitmapData로 만들 수수 없다.
2.2. JPG나 PNG로 Encode 하여 ByteArray를 얻는다.
Flex 3 SDK에는 mx.graphics.codec 패키지에 JPGEncoder와 PNGEncoder가 있다. 인터넷을 뒤져보면뒤져보면 GIFEncoder등도 있을것이다. Flex 2 환경에서 작업한다면 Google code에 Adobe AS3 Corelib에Corelib에 이들이 제공된다. 만약 JPGEncoder를 사용한다면 다음과 같이 하면 되겠다.
JPGEncoder를 이용하여 JPG ByteArray값 만들기
import mx.graphics.codec.JPGEncoder;
var byteArray:ByteArray = new JPGEncoder().encode(bitmapData);
Flex 3 SDK는 이러한 Encoder가 IImageEncoder로 구현되었다. 필요하다면 언제언제 어디서나 Encoder를 바꿔야 하는 경우IImageEncoder를 사용하는 것이 좋을 수 있겠다.있겠다.
가령 아래 예제처럼 말이다.
다양한 Image Encoder 사용하기사용하기
import mx.graphics.codec.*;
var imageType:String = "jpg";
var imageEncoder:IImageEncoder;
if( imageType.toUpperCase() == "JPG" ) imageEncoder= new JPEGEncoder();
else if( imageType.toUpperCase() == "PNG" ) imageEncoder= new PNGEncoder();
var byteArray:ByteArray = imageEncoder.encode(bitmapData);
3. 서버에 ByteArray를 전송한다.
데이타를 전송할때는 FileReference를 사용하지 않는다.
바로 URLLoader와 URLRequest만 이용해서이용해서 전송이 가능하다. 참고 데이타는 POST방식으로 URLVariable을 이용해서 보낼 수있다.
Flex/AIR 데이터 전송 방법
//assumed variable declarations
//var byteArray:ByteArray = 2번째 단계에서 JPG 데이타를 얻었다.
//var fileName:String = "desiredfilename.jpg" //저장할 파일 이름이다. 아무거나 적자!
//var uploadPath:String = "저장할 때 사용되는 서버측 script 경로"
//var parameters:URLVariables = 이미지 이외에 다른 보낼 다른 데이타가 있다면 이것을 이용한다.
//function onComplete(eventObj:Event):void { 성공적으로 데이타를 전송했을때 핸들러 함수 정의
//function onError(eventObj:ErrorEvent):void { 이미지 전송을 실패했을때 핸들러 함수 정의
var urlRequest:URLRequest = new URLRequest();
urlRequest.url = uploadPath;
urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = UploadPostHelper.getPostData(file, byteArray, parameters);
urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onError);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
urlLoader.load(urlRequest);
위에 진한 부분에 대한 클래스는 아래에 정의되어 있다. 당신은당신은 이 클래스가 어떻게 구성되었는가 열심히 공부할 필요가 없다.(원한다면 해도 된다. 말리지말리지 않음 ^^)
UploadPostHelper Class (Language :: java)
package {
import flash.events.*;
import flash.net.*;
import flash.utils.ByteArray;
import flash.utils.Endian;
/**
* Take a fileName, byteArray, and parameters object as input and return ByteArray post data suitable for a UrlRequest as output
*
* @see http://marstonstudio.com/?p=36
* @see http://www.w3.org/TR/html4/interact/forms.html
* @see http://www.jooce.com/blog/?p=143
* @see http://www.jooce.com/blog/wp%2Dcontent/uploads/2007/06/uploadFile.txt
* @see http://blog.je2050.de/2006/05/01/save-bytearray-to-file-with-php/
*
* @author Jonathan Marston
* @version 2007.08.19
*
* This work is licensed under a Creative Commons Attribution NonCommercial ShareAlike 3.0 License.
* @see http://creativecommons.org/licenses/by-nc-sa/3.0/
*
*/
public class UploadPostHelper {
/**
* Boundary used to break up different parts of the http POST body
*/
private static var _boundary:String = "";
/**
* Get the boundary for the post.
* Must be passed as part of the contentType of the UrlRequest
*/
public static function getBoundary():String {
if(_boundary.length == 0) {
for (var i:int = 0; i < 0x20; i++ ) {
_boundary += String.fromCharCode( int( 97 + Math.random() * 25 ) );
}
}
return _boundary;
}
/**
* Create post data to send in a UrlRequest
*/
public static function getPostData(fileName:String, byteArray:ByteArray, parameters:Object = null):ByteArray {
var i: int;
var bytes:String;
var postData:ByteArray = new ByteArray();
postData.endian = Endian.BIG_ENDIAN;
//add Filename to parameters
if(parameters == null) {
parameters = new Object();
}
parameters.Filename = fileName;
//add parameters to postData
for(var name:String in parameters) {
postData = BOUNDARY(postData);
postData = LINEBREAK(postData);
bytes = 'Content-Disposition: form-data; name="' + name + '"';
for ( i = 0; i < bytes.length; i++ ) {
postData.writeByte( bytes.charCodeAt(i) );
}
postData = LINEBREAK(postData);
postData = LINEBREAK(postData);
postData.writeUTFBytes(parameters[name]);
postData = LINEBREAK(postData);
}
//add Filedata to postData
postData = BOUNDARY(postData);
postData = LINEBREAK(postData);
bytes = 'Content-Disposition: form-data; name="Filedata"; filename="';
for ( i = 0; i < bytes.length; i++ ) {
postData.writeByte( bytes.charCodeAt(i) );
}
postData.writeUTFBytes(fileName);
postData = QUOTATIONMARK(postData);
postData = LINEBREAK(postData);
bytes = 'Content-Type: application/octet-stream';
for ( i = 0; i < bytes.length; i++ ) {
postData.writeByte( bytes.charCodeAt(i) );
}
postData = LINEBREAK(postData);
postData = LINEBREAK(postData);
postData.writeBytes(byteArray, 0, byteArray.length);
postData = LINEBREAK(postData);
//add upload filed to postData
postData = LINEBREAK(postData);
postData = BOUNDARY(postData);
postData = LINEBREAK(postData);
bytes = 'Content-Disposition: form-data; name="Upload"';
for ( i = 0; i < bytes.length; i++ ) {
postData.writeByte( bytes.charCodeAt(i) );
}
postData = LINEBREAK(postData);
postData = LINEBREAK(postData);
bytes = 'Submit Query';
for ( i = 0; i < bytes.length; i++ ) {
postData.writeByte( bytes.charCodeAt(i) );
}
postData = LINEBREAK(postData);
//closing boundary
postData = BOUNDARY(postData);
postData = DOUBLEDASH(postData);
return postData;
}
/**
* Add a boundary to the PostData with leading doubledash
*/
private static function BOUNDARY(p:ByteArray):ByteArray {
var l:int = UploadPostHelper.getBoundary().length;
p = DOUBLEDASH(p);
for (var i:int = 0; i < l; i++ ) {
p.writeByte( _boundary.charCodeAt( i ) );
}
return p;
}
/**
* Add one linebreak
*/
private static function LINEBREAK(p:ByteArray):ByteArray {
p.writeShort(0x0d0a);
return p;
}
/**
* Add quotation mark
*/
private static function QUOTATIONMARK(p:ByteArray):ByteArray {
p.writeByte(0x22);
return p;
}
/**
* Add Double Dash
*/
private static function DOUBLEDASH(p:ByteArray):ByteArray {
p.writeShort(0x2d2d);
return p;
}
}
}
한가지한가지 중요한 정보를 언급하겠다.
URLLoader를 이용해 서버에 전송할때, 프로그램이 같은같은 도메인상에 있는 경우에는 보안문제가 없다. 하지만 다른 도메인에 위치한 서버로 이미지를이미지를 전송할때는 반드시 crossdomain.xml을 check해야한다.
1. Security.loadPolicyFile(http://다른도메인/crossdomain.xml); 를 URLLoader의URLLoader의 load()함수를 호출하기 전에 호출한다.
2. Flash Player 9.0.124.0 버전부터는버전부터는 HTTP Header 보안취약점을 해결하기 위해서 cross domain 정책이 변경되었는데.... 서버측에 있는있는 crossdomain.xml에 allow-http-request-headers-from가 추가되어져야 한다. 이것은 HTTP 헤더 전송을 허용할지 결정해준다.
crossdomain.xml (Language : xml)
<?xml version="1.0"?>
http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.jidolstar.com" />
<allow-http-request-headers-from domain="*.jidolstar.com" headers="*"/>
</cross-domain-policy>
위 처럼 서버측 crossdomain.xml에 allow-http-request-headers-from을 추가함으로 다른 도메인간에 HTTPHTTP 헤더 전송을 허용할 수있다.
서로 다른 도메인에 SWF와SWF와 서버측 코드가 배치되어 있다면 반드시 이 사실을 숙지하길 바란다.
4. 서버측 코드 작성
만약 위 3번 코드에서 var parameters:URLVariables를 아래와 같이같이 작성했다고 하자.
URLVariables 설정 (Language :: java)
var parameters:URLVariables = new URLVariables();
parameters.method = "id";
parameters.userId = "2000321";
그럼 PHP 코드로 아래와아래와 같은 방법처럼 만들면 되겠다.(테스트는 안해봤음)
PHP 코드 예제예제 (Language : php)
<?php
$method = $_POST['method'];
$userId = $_POST['userId'];
$file_temp = $_FILES['Filedata']['tmp_name'];
$file_name = $_FILES['Filedata']['name'];
$file_size = $_FILES['Filedata']['size'];
if( $method == "id" )
{
$movePath = "/home/myPath/images/$userId_$file_name";
}
else
{
$movePath = "/home/myPath/images/time_".time()."_".$file_name;
}
move_uploaded_file($file_temp,$movePath);
echo "save Complete";
?>
마지막 save Comple 메시지를 받기 위해서는 Flex의 Complete 이벤트 발생시 아래와아래와 같은 방법으로 받으면 되겠다. 이것을 알아내는데도 많이 힘들었다. 일종의 팁이다. ^^;^^;
데이타 받기 (Language : java)
var loader:URLLoader = URLLoader(event.target);
var bytedata:ByteArray = loader.data;
var strData:String = bytedata.toString();
trace( strData)
실제 업무에도 잘 이용하고 있다.
이미지이미지 에디터 등을 만들때 아주아주 유용한 자료가 될 것이다.
누가 예제예제 프로그램 만들어서 트랙백 걸어 주시면 고맙겠다.
자료 출처출처
http://marstonstudio.com/2007/08/19/how-to-take-a-snapshot-of-a-flash-movie-and-automatically-upload-the-jpg-to-a-server-in-three-easy-steps/
지돌스타 블로그내 참고자료
- ImageSnapshot 클래스에 대해 : http://blog.jidolstar.com/301
- FileReference의 UploadCompleteData 이벤트이벤트 : http://blog.jidolstar.com/324
- 동영상 캡쳐 방법 : http://blog.jidolstar.com/215
글쓴이 : 지돌스타(http://blog.jidolstar.com/352)
=================================
=================================
=================================
출처: http://stackoverflow.com/questions/6876588/sending-and-receiving-data-from-flash-as3-to-php
AS3
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequestMethod;
import flash.events.Event;
submitbtn.addEventListener(MouseEvent.CLICK, sendData)
function sendData(event:MouseEvent):void
{
var loader : URLLoader = new URLLoader;
var urlreq:URLRequest = new URLRequest("http://[mydomain]/test.php");
var urlvars: URLVariables = new URLVariables;
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
urlreq.method = URLRequestMethod.POST;
urlvars.uname = nametxt.text;
urlvars.apellido = aptxt.text;
urlvars.email = emtxt.text;
urlvars.cedula = cctxt.text;
urlvars.score = scoretxt.text;
urlreq.data = urlvars;
loader.addEventListener(Event.COMPLETE, completed);
loader.load(urlreq);
}
function completed(event:Event): void
{
var loader2: URLLoader = URLLoader(event.target);
trace(loader2.data.done);
resptxt.text = event.target.data.done;
}
PHP inside of [domain]/test.php:
<?php
$username = $_POST["uname"];
$apellido = $_POST["apellido"];
$cedula = $_POST["cedula"];
$email = $_POST["email"];
$score = $_POST["score"];
print_r($_POST);
if (!($link=mysql_connect(databasemanager,username,password)))
{
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db(database,$link))
{
echo "Error seleccionando la base de datos.";
exit();
}
try
{
mysql_query("insert into scores(name,lastName,email,document,score) values('$username','$apellido','$email','$cedula','$score')",$link);
print "done=true";
}
catch(Exception $e)
{
print "done=$e->getMessage()";
}
echo "done=true";
?>
=================================
=================================
=================================
'ADOBE > ActionScript' 카테고리의 다른 글
플래시 액션스크립트 프레임(fps) 관련 프레임 레이트 프레임 체크 (0) | 2020.09.19 |
---|---|
[AS] 플래시 AS(액션스크립트) 보안 관련 Flash 데이터 HTTP 업로드 소켓 연결 에러 #2048 #2032 (0) | 2020.09.19 |
플래시 AS3.0 마우스 이밴트 처리 관련 (0) | 2020.09.19 |
플래시 AS3.0 플래시 html 에서 파라미터 (따로 설정한값 받기) .addCallback .call 관련 (0) | 2020.09.19 |
플래시 as3.0 삼성 스마트 티비 플래시 자바스크립트 연동관련 (0) | 2020.09.19 |