在ActionScript3.0中, 将Flash本地图像上传到服务器上
有这样一些应用:用户在Flash中编辑照片,将编辑后的图片使用WEB SERVICE发送到服务器.
在AS2.0中,要实现这个功能非常麻烦,需要逐像素点处理图片,然后生产可读字符串,传送到服务器上。
在AS3.0中,加入了ByteArray对象,使一切都变得简单方便多了
首先需要2个AS类 PNGEncoder 和Base64
前者在Adobe网站上可以找到, 后者是开源的
PNGEncoder
/**/ /*
Adobe Systems Incorporated(r) Source Code License Agreement
Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
Please read this Source Code License Agreement carefully before using
the source code.
Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable copyright license, to reproduce,
prepare derivative works of, publicly display, publicly perform, and
distribute this source code and such derivative works in source or
object code form without any attribution requirements.
The name "Adobe Systems Incorporated" must not be used to endorse or promote products
derived from the source code without prior written permission.
You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
against any loss, damage, claims or lawsuits, including attorney's
fees that arise or result from your use or distribution of the source
code.
THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com
{
import flash.geom. * ;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
public class PNGEncoder
{
public static function encode(img:BitmapData):ByteArray {
// Create output byte array
var png:ByteArray = new ByteArray();
// Write PNG signature
png.writeUnsignedInt( 0x89504e47 );
png.writeUnsignedInt( 0x0D0A1A0A );
// Build IHDR chunk
var IHDR:ByteArray = new ByteArray();
IHDR.writeInt(img.width);
IHDR.writeInt(img.height);
IHDR.writeUnsignedInt( 0x08060000 ); // 32bit RGBA
IHDR.writeByte( 0 );
writeChunk(png, 0x49484452 ,IHDR);
// Build IDAT chunk
var IDAT:ByteArray = new ByteArray();
for (var i: int = 0 ;i < img.height;i ++ ) {
// no filter
IDAT.writeByte( 0 );
var p: uint ;
var j: int ;
if ( ! img.transparent ) {
for (j = 0 ;j < img.width;j ++ ) {
p = img.getPixel(j,i);
IDAT.writeUnsignedInt(
uint (((p & 0xFFFFFF ) << 8 ) | 0xFF ));
}
} else {
for (j = 0 ;j < img.width;j ++ ) {
p = img.getPixel32(j,i);
IDAT.writeUnsignedInt(
uint (((p & 0xFFFFFF ) << 8 ) |
(p >>> 24 )));
}
}
}
IDAT.compress();
writeChunk(png, 0x49444154 ,IDAT);
// Build IEND chunk
writeChunk(png, 0x49454E44 , null );
// return PNG
return png;
}
private static var crcTable:Array;
private static var crcTableComputed:Boolean = false ;
private static function writeChunk(png:ByteArray,
type: uint , data:ByteArray): void {
if ( ! crcTableComputed) {
crcTableComputed = true ;
crcTable = [];
var c: uint ;
for (var n: uint = 0 ; n < 256 ; n ++ ) {
c = n;
for (var k: uint = 0 ; k < 8 ; k ++ ) {
if (c & 1 ) {
c = uint ( uint ( 0xedb88320 ) ^
uint (c >>> 1 ));
} else {
c = uint (c >>> 1 );
}
}
crcTable[n] = c;
}
}
var len: uint = 0 ;
if (data != null ) {
len = data.length;
}
png.writeUnsignedInt(len);
var p: uint = png.position;
png.writeUnsignedInt(type);
if ( data != null ) {
png.writeBytes(data);
}
var e: uint = png.position;
png.position = p;
c = 0xffffffff ;
for (var i: int = 0 ; i < (e - p); i ++ ) {
c = uint (crcTable[
(c ^ png.readUnsignedByte()) &
uint ( 0xff )] ^ uint (c >>> 8 ));
}
c = uint (c ^ uint ( 0xffffffff ));
png.position = e;
png.writeUnsignedInt(c);
}
}
}
/**/ /*
Adobe Systems Incorporated(r) Source Code License Agreement
Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
Please read this Source Code License Agreement carefully before using
the source code.
Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable copyright license, to reproduce,
prepare derivative works of, publicly display, publicly perform, and
distribute this source code and such derivative works in source or
object code form without any attribution requirements.
The name "Adobe Systems Incorporated" must not be used to endorse or promote products
derived from the source code without prior written permission.
You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
against any loss, damage, claims or lawsuits, including attorney's
fees that arise or result from your use or distribution of the source
code.
THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com
{
import flash.geom. * ;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
public class PNGEncoder
{
public static function encode(img:BitmapData):ByteArray {
// Create output byte array
var png:ByteArray = new ByteArray();
// Write PNG signature
png.writeUnsignedInt( 0x89504e47 );
png.writeUnsignedInt( 0x0D0A1A0A );
// Build IHDR chunk
var IHDR:ByteArray = new ByteArray();
IHDR.writeInt(img.width);
IHDR.writeInt(img.height);
IHDR.writeUnsignedInt( 0x08060000 ); // 32bit RGBA
IHDR.writeByte( 0 );
writeChunk(png, 0x49484452 ,IHDR);
// Build IDAT chunk
var IDAT:ByteArray = new ByteArray();
for (var i: int = 0 ;i < img.height;i ++ ) {
// no filter
IDAT.writeByte( 0 );
var p: uint ;
var j: int ;
if ( ! img.transparent ) {
for (j = 0 ;j < img.width;j ++ ) {
p = img.getPixel(j,i);
IDAT.writeUnsignedInt(
uint (((p & 0xFFFFFF ) << 8 ) | 0xFF ));
}
} else {
for (j = 0 ;j < img.width;j ++ ) {
p = img.getPixel32(j,i);
IDAT.writeUnsignedInt(
uint (((p & 0xFFFFFF ) << 8 ) |
(p >>> 24 )));
}
}
}
IDAT.compress();
writeChunk(png, 0x49444154 ,IDAT);
// Build IEND chunk
writeChunk(png, 0x49454E44 , null );
// return PNG
return png;
}
private static var crcTable:Array;
private static var crcTableComputed:Boolean = false ;
private static function writeChunk(png:ByteArray,
type: uint , data:ByteArray): void {
if ( ! crcTableComputed) {
crcTableComputed = true ;
crcTable = [];
var c: uint ;
for (var n: uint = 0 ; n < 256 ; n ++ ) {
c = n;
for (var k: uint = 0 ; k < 8 ; k ++ ) {
if (c & 1 ) {
c = uint ( uint ( 0xedb88320 ) ^
uint (c >>> 1 ));
} else {
c = uint (c >>> 1 );
}
}
crcTable[n] = c;
}
}
var len: uint = 0 ;
if (data != null ) {
len = data.length;
}
png.writeUnsignedInt(len);
var p: uint = png.position;
png.writeUnsignedInt(type);
if ( data != null ) {
png.writeBytes(data);
}
var e: uint = png.position;
png.position = p;
c = 0xffffffff ;
for (var i: int = 0 ; i < (e - p); i ++ ) {
c = uint (crcTable[
(c ^ png.readUnsignedByte()) &
uint ( 0xff )] ^ uint (c >>> 8 ));
}
c = uint (c ^ uint ( 0xffffffff ));
png.position = e;
png.writeUnsignedInt(c);
}
}
}
Base64
/**/ /* *********************************************************\
| |
| The implementation of PHPRPC Protocol 3.0 |
| |
| Base64.as |
| |
| Release 3.0.0 |
| Copyright (c) 2005-2007 by Team-PHPRPC |
| |
| WebSite: http://www.phprpc.org/ |
| http://www.phprpc.net/ |
| http://www.phprpc.com/ |
| http://sourceforge.net/projects/php-rpc/ |
| |
| Authors: Ma Bingyao <[email protected]> |
| |
| This file may be distributed and/or modified under the |
| terms of the GNU Lesser General Public License (LGPL) |
| version 3.0 as published by the Free Software Foundation |
| and appearing in the included file LICENSE. |
| |
\********************************************************* */
/**/ /* Base64 library for ActionScript 3.0.
*
* Copyright (C) 2007 Ma Bingyao <[email protected]>
* Version: 1.1
* LastModified: Oct 26, 2007
* This library is free. You can redistribute it and/or modify it.
*/
/**/ /*
* interfaces:
* import org.phprpc.util.Base64;
* import flash.utils.ByteArray;
* var data:ByteArray = new ByteArray();
* data.writeUTFBytes("Hello PHPRPC");
* var b64:String = Base64.encode(data);
* trace(b64);
* trace(Base64.decode(b64));
*/
package com {
import flash.utils.ByteArray;
public class Base64 {
private static const encodeChars:Array =
[ ' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' ,
' I ' , ' J ' , ' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' ,
' Q ' , ' R ' , ' S ' , ' T ' , ' U ' , ' V ' , ' W ' , ' X ' ,
' Y ' , ' Z ' , ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' ,
' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' ,
' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' ,
' w ' , ' x ' , ' y ' , ' z ' , ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' ,
' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' + ' , ' / ' ];
private static const decodeChars:Array =
[ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , 62 , - 1 , - 1 , - 1 , 63 ,
52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 ,
60 , 61 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , 0 , 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 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , 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 , - 1 , - 1 , - 1 , - 1 , - 1 ];
public static function encode(data:ByteArray):String {
var out :Array = [];
var i: int = 0 ;
var j: int = 0 ;
var r: int = data.length % 3 ;
var len: int = data.length - r;
var c: int ;
while (i < len) {
c = data[i ++ ] << 16 | data[i ++ ] << 8 | data[i ++ ];
out [j ++ ] = encodeChars[c >> 18 ] + encodeChars[c >> 12 & 0x3f ] + encodeChars[c >> 6 & 0x3f ] + encodeChars[c & 0x3f ];
}
if (r == 1 ) {
c = data[i ++ ];
out [j ++ ] = encodeChars[c >> 2 ] + encodeChars[(c & 0x03 ) << 4 ] + " == " ;
}
else if (r == 2 ) {
c = data[i ++ ] << 8 | data[i ++ ];
out [j ++ ] = encodeChars[c >> 10 ] + encodeChars[c >> 4 & 0x3f ] + encodeChars[(c & 0x0f ) << 2 ] + " = " ;
}
return out .join( '' );
}
public static function decode(str:String):ByteArray {
var c1: int ;
var c2: int ;
var c3: int ;
var c4: int ;
var i: int ;
var len: int ;
var out :ByteArray;
len = str.length;
i = 0 ;
out = new ByteArray();
while (i < len) {
// c1
do {
c1 = decodeChars[str.charCodeAt(i ++ ) & 0xff ];
} while (i < len && c1 == - 1 );
if (c1 == - 1 ) {
break ;
}
// c2
do {
c2 = decodeChars[str.charCodeAt(i ++ ) & 0xff ];
} while (i < len && c2 == - 1 );
if (c2 == - 1 ) {
break ;
}
out .writeByte((c1 << 2 ) | ((c2 & 0x30 ) >> 4 ));
// c3
do {
c3 = str.charCodeAt(i ++ ) & 0xff ;
if (c3 == 61 ) {
return out ;
}
c3 = decodeChars[c3];
} while (i < len && c3 == - 1 );
if (c3 == - 1 ) {
break ;
}
out .writeByte(((c2 & 0x0f ) << 4 ) | ((c3 & 0x3c ) >> 2 ));
// c4
do {
c4 = str.charCodeAt(i ++ ) & 0xff ;
if (c4 == 61 ) {
return out ;
}
c4 = decodeChars[c4];
} while (i < len && c4 == - 1 );
if (c4 == - 1 ) {
break ;
}
out .writeByte(((c3 & 0x03 ) << 6 ) | c4);
}
return out ;
}
}
}
/**/ /* *********************************************************\
| |
| The implementation of PHPRPC Protocol 3.0 |
| |
| Base64.as |
| |
| Release 3.0.0 |
| Copyright (c) 2005-2007 by Team-PHPRPC |
| |
| WebSite: http://www.phprpc.org/ |
| http://www.phprpc.net/ |
| http://www.phprpc.com/ |
| http://sourceforge.net/projects/php-rpc/ |
| |
| Authors: Ma Bingyao <[email protected]> |
| |
| This file may be distributed and/or modified under the |
| terms of the GNU Lesser General Public License (LGPL) |
| version 3.0 as published by the Free Software Foundation |
| and appearing in the included file LICENSE. |
| |
\********************************************************* */
/**/ /* Base64 library for ActionScript 3.0.
*
* Copyright (C) 2007 Ma Bingyao <[email protected]>
* Version: 1.1
* LastModified: Oct 26, 2007
* This library is free. You can redistribute it and/or modify it.
*/
/**/ /*
* interfaces:
* import org.phprpc.util.Base64;
* import flash.utils.ByteArray;
* var data:ByteArray = new ByteArray();
* data.writeUTFBytes("Hello PHPRPC");
* var b64:String = Base64.encode(data);
* trace(b64);
* trace(Base64.decode(b64));
*/
package com {
import flash.utils.ByteArray;
public class Base64 {
private static const encodeChars:Array =
[ ' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' ,
' I ' , ' J ' , ' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' ,
' Q ' , ' R ' , ' S ' , ' T ' , ' U ' , ' V ' , ' W ' , ' X ' ,
' Y ' , ' Z ' , ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' ,
' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' ,
' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' ,
' w ' , ' x ' , ' y ' , ' z ' , ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' ,
' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' + ' , ' / ' ];
private static const decodeChars:Array =
[ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , 62 , - 1 , - 1 , - 1 , 63 ,
52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 ,
60 , 61 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , 0 , 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 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , 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 , - 1 , - 1 , - 1 , - 1 , - 1 ];
public static function encode(data:ByteArray):String {
var out :Array = [];
var i: int = 0 ;
var j: int = 0 ;
var r: int = data.length % 3 ;
var len: int = data.length - r;
var c: int ;
while (i < len) {
c = data[i ++ ] << 16 | data[i ++ ] << 8 | data[i ++ ];
out [j ++ ] = encodeChars[c >> 18 ] + encodeChars[c >> 12 & 0x3f ] + encodeChars[c >> 6 & 0x3f ] + encodeChars[c & 0x3f ];
}
if (r == 1 ) {
c = data[i ++ ];
out [j ++ ] = encodeChars[c >> 2 ] + encodeChars[(c & 0x03 ) << 4 ] + " == " ;
}
else if (r == 2 ) {
c = data[i ++ ] << 8 | data[i ++ ];
out [j ++ ] = encodeChars[c >> 10 ] + encodeChars[c >> 4 & 0x3f ] + encodeChars[(c & 0x0f ) << 2 ] + " = " ;
}
return out .join( '' );
}
public static function decode(str:String):ByteArray {
var c1: int ;
var c2: int ;
var c3: int ;
var c4: int ;
var i: int ;
var len: int ;
var out :ByteArray;
len = str.length;
i = 0 ;
out = new ByteArray();
while (i < len) {
// c1
do {
c1 = decodeChars[str.charCodeAt(i ++ ) & 0xff ];
} while (i < len && c1 == - 1 );
if (c1 == - 1 ) {
break ;
}
// c2
do {
c2 = decodeChars[str.charCodeAt(i ++ ) & 0xff ];
} while (i < len && c2 == - 1 );
if (c2 == - 1 ) {
break ;
}
out .writeByte((c1 << 2 ) | ((c2 & 0x30 ) >> 4 ));
// c3
do {
c3 = str.charCodeAt(i ++ ) & 0xff ;
if (c3 == 61 ) {
return out ;
}
c3 = decodeChars[c3];
} while (i < len && c3 == - 1 );
if (c3 == - 1 ) {
break ;
}
out .writeByte(((c2 & 0x0f ) << 4 ) | ((c3 & 0x3c ) >> 2 ));
// c4
do {
c4 = str.charCodeAt(i ++ ) & 0xff ;
if (c4 == 61 ) {
return out ;
}
c4 = decodeChars[c4];
} while (i < len && c4 == - 1 );
if (c4 == - 1 ) {
break ;
}
out .writeByte(((c3 & 0x03 ) << 6 ) | c4);
}
return out ;
}
}
}
下面的代码就很简单了,首先获取到BitmapData对象,然后用PNGEncoder编码压缩一次,再用Base64编码得到可读字符串,然后通过WEB SERVICE发送到服务器
var
objBitmap:BitmapData
=
new
BitmapData( mcPlaceHolder.width
, mcPlaceHolder.height
, true
, 0
);
objBitmap.draw(mcPlaceHolder)
var bytes:ByteArray = PNGEncoder.encode(objBitmap);
// trace( Base64.encode(bytes) );
var paramObj:Object = LoaderInfo( this .root.loaderInfo).parameters;
var ws:WebService = new WebService(paramObj[ " WebSvcPath " ]);
ws.onLoad = function (e)
{
trace(this.getWsInfo());
}
ws.onError = function (e)
{
trace(e.toString());
}
var sr:EventDispatcher = ws.call( " TestUpdate " , Base64.encode(bytes));
sr.addEventListener( " complete " , completeHandler);
sr.addEventListener( " error " , errorHandler);
function errorHandler(e)
{
}
function completeHandler(e)
{
trace("-------------------------");
trace("TestUpdate xml:");
trace(e.xml);
trace("-------------------------");
trace("TestUpdate data:");
trace(e.data);
}
, mcPlaceHolder.height
, true
, 0
);
objBitmap.draw(mcPlaceHolder)
var bytes:ByteArray = PNGEncoder.encode(objBitmap);
// trace( Base64.encode(bytes) );
var paramObj:Object = LoaderInfo( this .root.loaderInfo).parameters;
var ws:WebService = new WebService(paramObj[ " WebSvcPath " ]);
ws.onLoad = function (e)
{
trace(this.getWsInfo());
}
ws.onError = function (e)
{
trace(e.toString());
}
var sr:EventDispatcher = ws.call( " TestUpdate " , Base64.encode(bytes));
sr.addEventListener( " complete " , completeHandler);
sr.addEventListener( " error " , errorHandler);
function errorHandler(e)
{
}
function completeHandler(e)
{
trace("-------------------------");
trace("TestUpdate xml:");
trace(e.xml);
trace("-------------------------");
trace("TestUpdate data:");
trace(e.data);
}