Flash从amfphp中读ByteArray出错解决

  1. 相关形容语句:
  2. 问题描述:
  3. 施救方案:
    1. 方案1:
    2. 方案2:

谁来拯救我?flash从amfphp中读ByteArray出错

相关形容语句:

  1. 从AMFPHP中发送ByteArray给flash出错 / AMF不能以ByteArray发送给AS3 / ByteArray无法Remote给Flash
  2. TypeError: Error #1034: Type Coercion failed: cannot convert Object@******* to flash.utils.ByteArray. / TypeError: Error #1034: 强制转换类型失败:无法将 Object@*******转换为 flash.utils.ByteArray
  3. 情况出现在AS3 FLASH的远程通信中 ,不是FLEX的远程通信中

问题描述:

我将文件保存在服务器上,希望通过amfphp将文件以ByteArray返回。就像这样:
PHP部分 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


技术内容转载请注明来源,个人日记不允许转载,欢迎指出任何有错误或不够清晰的表达。可以邮件至 mousebomb@gmail.com