Tag Archives: URLLoader

User-initiated action requirements in Flash Player 10

플래시 플레이어 10에선, 사용자의 인터랙션(UIA, user-initiated action)이 없이 FileRefernece.browse()나 FileReference.download() 메쏘드를 실행할 수 없습니다. 그런데 플래시에서 ByteArray로 인코딩된 파일을 URLLoader API를 이용하여 업로드 하는 경우에도, 위의 제약사항이 적용됩니다.

그리고 아래 코드와 같이 dispatchEvent()로 우회하는 방법도 더 이상 사용할 수 없습니다.

In Flash Player 10, FileReference.browse() and FileReference.download() methods can not be executed without a user-initiated action(UIA). It applies to URLLoader API, when you encode a file via ByteArray and upload it to a server.

It can not be bypassed with the followind code.

Flash Player 10で、ユーザのアクション(UIA, user-initiated action)無しに、FileReference.browse()やFileReference.download()メソッドを実行出来ません。ところが、ByteArrayを使って生成したファイルを、URLLoader APIでサーバーに伝送する場合も、この制約が適用される。

また、下のコードのように、dispatchEvent()で廻る方法も効かない。

dispatchEvent(new MouseEvent(MouseEvent.CLICK));

Related URL
- Understanding the security changes in Flash Player 10
- User-initiated action requirements in Flash Player 10

Share Button

플래시와 XML 인코딩이 다른 경우 데이터 로드하기

보통 AS3에서 외부 데이터를 로드하기 위해서 URLLoader를 많이 사용합니다. 그런데 플래시의 인코딩 설정과 로드할 XML 또는 텍스트 파일의 인코딩 설정이 다른 경우에 2바이트 언어의 문자가 깨져서 들어오죠. 그래서 System.useCodePage 설정을 바꿔주거나, 텍스트 파일의 인코딩을 변경하거나 둘 중 하나를 해 주어야 합니다. 뭐 좀 귀찮지만, 여기까진 문제가 없죠.

그런데, 만약, 서로 다른 인코딩의 텍스트 파일 2개 이상을 동시에 로드해야 하는 경우라면 OTL 이죠. 이럴 때 XMLLoader를 사용하면 문제가 말끔히 사라집니다. ^^

상황 1
플래시 EUC-KR —– 텍스트 UTF-8
XMLLoader.load(UR [,"utf-8"]);==> 한글 정상 표시
URLLoader.load(UR) ==> 한글 깨짐
(UR은 URLRequest 객체)

상황2
플래시 UTF-8 —– 텍스트 EUC-KR
XMLLoader.load(UR, “euc-kr”) ==> 한글 정상 표시
URLLoader.load(UR) ==> 한글 깨짐

상황3
플래시 UTF-8 —– 텍스트1 UTF-8, 텍스트2 EUC-KR
XMLLoader.load(UR1 [, "utf-8"]) ==> 한글 정상 표시
XMLLoader.load(UR2, “euc-kr”) ==> 한글 정상 표시
URLLoader.load(UR1) ==> 한글 정상 표시
URLLoader.load(UR2) ==> 한글 깨짐

XMLLoader는 내부적으로 URLStream을 사용하는 것으로, URLLoader 대신 URLStream 을 사용하여도 같은 효과를 얻을 수 있습니다.

참고 URL: http://hangunsworld.com/blog/259

Share Button

XMLLoader, a custom class.

I devised the XMLLoader class to avoid the URLLoader bug that I posted on FlaLab.com.
Related links
예전에 FlaLab에 올렸던 URLLoader의 버그를 회피하기 위해서 만든 XMLLoader 클래스 입니다.
참고 링크
私がFlaLab.comに書いたURLLoaderのバーグを回避するためにXMLLoaderクラスを作りました。
参考リンク

http://www.flalab.com/phpBB2/viewtopic.php?t=1791
http://www.flalab.com/phpBB2/viewtopic.php?t=2228

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/**
 * XMLLoader
 *
 * XMLLoader class loads and validates an XML file.
 * If you loads a text file encoded in the euc-kr encoding via an URLLoader, frequently, the source data is currupted.
 * To avoid this problem, parses the loaded data into an XMLDocument,
 * then, parses the first node of the XMLDocument into an XML.
 * If an error has been occured, reloads the XML data.
 * 
 *
 * @author: Han Sanghun (http://hangunsworld.com, hanguns@gmail.com)
 * @created: 2008 02 28
 * @last modified: 2008 02 29
 */
 
 
package com.hangunsworld.as3.net{
 
	import	flash.events.*;
	import	flash.net.*;
	import	flash.utils.Timer;
	import	flash.xml.*;
 
 
	public class XMLLoader{
 
 
		private var path:String;
		private var returnFunction:Function;
		private var errorFunction:Function;
 
		private var timer:Timer;
		private var xml:XML;
 
		private var xml_ul:URLLoader;
		private var xml_ur:URLRequest;
		private var xml_uv:URLVariables;
 
		/**
		 * XMLLoader constructor
		 *
		 * @param pPath A path of an XML file
		 * @param okFunc A function to call when the XML is loaded successfully
		 * @param errorFunc A function to call when an IOError has occured
		 */
		public function XMLLoader(pPath:String, okFunc:Function=null, errorFunc:Function=null){
 
			path = pPath;
			returnFunction = okFunc;
			errorFunction = errorFunc
 
			XML.ignoreWhitespace = true;
			XML.ignoreComments = true;
 
 
			// Initializes NET objects
			xml_ul = new URLLoader();
			xml_ul.addEventListener (Event.COMPLETE, xmlCompleteListener);
			xml_ul.addEventListener (IOErrorEvent.IO_ERROR, errorListener);
 
			xml_ur = new URLRequest();
			xml_ur.url = path;
 
			xml_uv = new URLVariables();
 
 
			// Initializes Timer object
			timer = new Timer(50, 1);
			timer.addEventListener(TimerEvent.TIMER, timerListener);
 
			timer.start();
 
 
		}// end constructor
 
 
		/**
		 * Timer EventListener
		 * Loads an XML file after some time
		 */
		private function timerListener(evt:TimerEvent):void{
			loadXML();
		}// end timerListener
 
 
		/**
		 * Loads an XML file
		 */
		private function loadXML():void{
 
			if(path.indexOf("?") >= 0){
				// If the url already contains parameters, attaches the random seed to the end of the url
				xml_ur.url = path + "&randomSeed=" + Math.floor(Math.random() * 1000000);
			}else{
				// If the url does not contain parameters, uses an URLVariable object
				xml_uv.randomSeed = Math.floor(Math.random() * 1000000);
				xml_ur.data = xml_uv;
			}
 
			xml_ul.load (xml_ur);
 
		}// end loadXML
 
 
		/**
		 * XML Complete EventListener
		 */
		private function xmlCompleteListener(evt:Event):void{
 
			// Sets the defualt parse state to false
			var parsed:Boolean = false;
 
			var str:String = evt.target.data;
 
			var xmldoc:XMLDocument = new XMLDocument();
			xmldoc.ignoreWhite = true;
 
			try{
 
				// Parses the loaded data into an XMLDocument
				xmldoc.parseXML(str);
 
				// Gets a string from the first node of the XMLDocument
				str = xmldoc.firstChild.toString();
 
				// Parses the string into an XML
				xml = new XML(str);
 
				// If no error has occured, sets the parse stae to true
				parsed = true;
 
			}catch(e){
 
				// If an error occured, loads the XML again
				timer.start();
 
			}// end try catch
 
 
			// If the parse process done without errors and the returnFunction is NOT null, returns the XML data
			if(parsed){
				if(returnFunction != null){
					returnFunction(xml);
				}
			}
 
 
		}// end xmlCompleteListener
 
		/**
		 * XML IOError EventListener
		 */
		private function errorListener(evt:IOErrorEvent):void{
 
			if(errorFunction != null){
				errorFunction(evt);
			}
 
		}// end xmlErrorListener
 
 
	}// end class
 
}// end package
1
2
3
4
5
6
7
8
9
10
11
12
import	com.hangunsworld.as3.net.XMLLoader;
 
var xloader:XMLLoader;
xloader = new XMLLoader(xmlPath, xmlLoaded, xmlErrorListener);
 
function xmlLoaded(xx:XML):void{
	// xml loaded
}
 
function xmlErrorListener(evt:IOErrorEvent):void{
	trace("xml load error");
}
Share Button