:::: 菜单 ::::

Flash从amfphp中读ByteArray出错解决

谁来拯救我?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部分

  1. <?php
  2. class Test
  3. {
  4. public function a()
  5. {
  6. return new ByteArray(file_get_contents(“$文件路径”));
  7. }
  8. }

AS部分

  1. package {
  2. import flash.net.NetConnection;
  3. import flash.display.Sprite;
  4. import flash.utils.ByteArray;
  5. import flash.net.ObjectEncoding;
  6. import flash.events.*;
  7. import flash.net.Responder;
  8.  
  9. public class Test extends Sprite{
  10. private var __netConn:NetConnection = new NetConnection();
  11. private var __gateWay:String;
  12.  
  13. public function Test():void
  14. {
  15. var gw:String="http://Universe.mousebomb/amf/gateway.php";//修改地址测试
  16. __netConn.objectEncoding=ObjectEncoding.AMF3;
  17. __netConn.connect(gw);
  18.  
  19. __netConn.call("mousebomb.Test.a", new Responder(onCallResult,onCallFault));
  20.  
  21. }
  22. private function onCallResult(re:ByteArray):void 
  23. {
  24. trace(re);//输出: TypeError: Error #1034: 强制转换类型失败:无法将 Object@3046179 转换为 flash.utils.ByteArray。
  25. }
  26. private function onCallFault(re:Object):void
  27. {
  28. for (var i in re) {
  29. trace(i+"=>"+re[i]);
  30. }
  31. }
  32. }
  33. }

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代码:

  1. //…
  2. $contents = base64_encode(file_get_contents(“$文件路径”));
  3. return $contents;

AS代码:

  1. protected function onCallResult(re:String):void 
  2. {
  3. var fileBytes:ByteArray = Base64.decodeToByteArray(re);
  4. //fileBytes已获得. 可以有很多用途,比如,用Loader载入一幅图片...
  5. //…
  6. }

此法将文件以base64的字符串返回,flash中再解码为ByteArray,使用这一招需要import http://dynamicflash.com/goodies/base64/ 提供的类
如果你懒得去,可以在我这里下载

方案2:

其实关键就是这个,不能以为在Flash中设置了NetConnection.objectEncoding = ObjectEncoding.AMF3就行,实际上,更重要的是AMFPHP这边要设置为AMF3编码。
PHP代码中加入

  1. $GLOBALS['amfphp']['encoding'] = 'amf3';

AS代码比如可以这么写

  1. protected  function onCallResult(re:ByteArray):void 
  2. {
  3.     //....直接用re喽
  4. }

问题迎刃而解……

记录与此,其实这本不成问题……希望本文对你有用,遇到同样情况,不用像我一样走很多弯路。
这个问题从昨天晚上就使我非常困扰,经过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

延伸阅读