谁来拯救我?flash从amfphp中读ByteArray出错
相关形容语句:
- 从AMFPHP中发送ByteArray给flash出错 / AMF不能以ByteArray发送给AS3 / ByteArray无法Remote给Flash
- TypeError: Error #1034: Type Coercion failed: cannot convert Object@******* to flash.utils.ByteArray. / TypeError: Error #1034: 强制转换类型失败:无法将 Object@*******转换为 flash.utils.ByteArray
- 情况出现在AS3 FLASH的远程通信中 ,不是FLEX的远程通信中
问题描述:
我将文件保存在服务器上,希望通过amfphp将文件以ByteArray返回。就像这样:
PHP部分
- <?php
- class Test
- {
- public function a()
- {
- return new ByteArray(file_get_contents(“$文件路径”));
- }
- }
AS部分
- package {
- import flash.net.NetConnection;
- import flash.display.Sprite;
- import flash.utils.ByteArray;
- import flash.net.ObjectEncoding;
- import flash.events.*;
- import flash.net.Responder;
- public class Test extends Sprite{
- private var __netConn:NetConnection = new NetConnection();
- private var __gateWay:String;
- public function Test():void
- {
- var gw:String="http://Universe.mousebomb/amf/gateway.php";//修改地址测试
- __netConn.objectEncoding=ObjectEncoding.AMF3;
- __netConn.connect(gw);
- __netConn.call("mousebomb.Test.a", new Responder(onCallResult,onCallFault));
- }
- private function onCallResult(re:ByteArray):void
- {
- trace(re);//输出: TypeError: Error #1034: 强制转换类型失败:无法将 Object@3046179 转换为 flash.utils.ByteArray。
- }
- private function onCallFault(re:Object):void
- {
- for (var i in re) {
- trace(i+"=>"+re[i]);
- }
- }
- }
- }
AMF返回的结果在AMFPHP的browser里可以看到类型是ByteArray:
(flash.utils::ByteArray)#0
bytesAvailable = 124118
endian = “bigEndian”
length = 124118
objectEncoding = 3
position = 0
可是我测试用的flash里输出:
TypeError: Error #1034: 强制转换类型失败:无法将 Object@3046179 转换为 flash.utils.ByteArray。
哪里存在问题?
施救方案:
方案1:
PHP代码:
- //…
- $contents = base64_encode(file_get_contents(“$文件路径”));
- return $contents;
AS代码:
- protected function onCallResult(re:String):void
- {
- var fileBytes:ByteArray = Base64.decodeToByteArray(re);
- //fileBytes已获得. 可以有很多用途,比如,用Loader载入一幅图片...
- //…
- }
此法将文件以base64的字符串返回,flash中再解码为ByteArray,使用这一招需要import http://dynamicflash.com/goodies/base64/ 提供的类
如果你懒得去,可以在我这里下载。
方案2:
其实关键就是这个,不能以为在Flash中设置了NetConnection.objectEncoding = ObjectEncoding.AMF3就行,实际上,更重要的是AMFPHP这边要设置为AMF3编码。
在PHP代码中加入
- $GLOBALS['amfphp']['encoding'] = 'amf3';
AS代码比如可以这么写
- protected function onCallResult(re:ByteArray):void
- {
- //....直接用re喽
- }
问题迎刃而解……
记录与此,其实这本不成问题……希望本文对你有用,遇到同样情况,不用像我一样走很多弯路。
这个问题从昨天晚上就使我非常困扰,经过20小时多的奋战,搜救行动终于取得了进展,得到两条解决方案。
尽管实现了需要的效果,但依然有困惑:似乎这个问题只存在于FLASH中,FLEX是没问题的。有人也这么说。
感慨:中文技术总结太少,总搜索不到。这次真是倒霉大了,险些连英文的我都没找到…… 感谢:AuZn、杜增强、Y-boy、寂寞火山提供的线索……
参考资料:
http://forum.sephiroth.it/showthread.php?t=10194 此论坛某仁兄提问“Blob field not casted to ByteArray upon sending to AS3 ”
http://www.astorm.ch/blog/index.php?post/2008/04/01/Remoting-et-ByteArray-avec-Flash-et-AS3 Remoting et ByteArray avec Flash et AS3
哈,写上来了,顶一下。
使用 amf3 协议
http://balazs.sebesteny.com/amfphp-bytearray-encoding-issue/
很好的方法!
如果可以弄一个更详细的就好了