代码之家  ›  专栏  ›  技术社区  ›  Doug Neiner

将字节字符串返回到ExternalInterface.Call时引发错误

  •  8
  • Doug Neiner  · 技术社区  · 14 年前

    我正在开发我的开源项目 Downloadify 到目前为止,它只处理返回字符串以响应 ExternalInterface.call 命令。

    我正试图用 JSZip 并一起下载,最终结果是在浏览器中动态创建一个zip文件,然后使用 FileReference.save .但是,这是我的问题:

    jszip库可以返回 base64 zip的编码字符串,或原始字节字符串。问题是,如果我返回该字节字符串以响应 外部接口.call 命令,我得到这个错误:

    Error #1085: The element type "string" must be terminated by the matching end-tag "</string>"
    

    ActionScript 3:

    var theData:* = ExternalInterface.call('Downloadify.getTextForSave',queue_name);
    

    在哪里? queue_name 只是用于标识JS中正确实例的字符串。

    JavaScript:

    var zip = new JSZip();
    zip.add("test.txt", "Hello world!\n");
    var content = zip.generate(true);
    return content;
    

    如果我返回的是普通字符串而不是字节字符串,则调用工作正常。我希望避免使用 Base64 因为我必须包括 Base64 我的解码器 swf 这将增加它的大小。

    最后:我是 正在查找AS3 Zip生成器。我的项目必须在javascript中运行该部分

    我无可否认 一个AS3程序员,如果你需要更多的细节,请告诉我。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Robert Bak    14 年前

    当从javascript调用返回数据时,它将被序列化为XML字符串。因此,如果jszip返回的“原始字符串”包含使XML无效的字符,我认为这就是这里发生的情况,那么您将得到这样的错误。

    你得到的回报实际上是:

    <string>[your JSZip generated string]</string>
    

    假设您的返回字符串包含一个“<”字符-这将使XML无效,而且很难知道原始字节流也将转换哪些字符代码。

    您可以在上阅读有关外部API XML格式的更多信息 LiveDocs

        2
  •  1
  •   Taryn    11 年前

    我认为问题是由这样一个事实引起的,即flash需要一个utf8字符串,而您向它扔了一些二进制的东西。例如,我认为0x00FF将不会是有效的utf8…

    你可以试着摆弄一下 flash.system::System.setCodePage 但我不会太乐观…

    我想base64解码器可能是最简单的…我宁愿担心速度而不是文件大小…这种基本的解码器方法使用的K不到一半:

    public function decodeBase64(source:String):ByteArray {
     var ret:ByteArray = new ByteArray();
     var map:Object = new Object();
     var i:int = 0;
     for each (var char:String in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("")) map[char] = i++;
     map["="] = 0;
     source = source.split("\n").join("").split("\r").join("");//remove linebreaks
     for (i = 0; i < source.length/4; i++) {
      var buf:int = 0;
      for each (char in source.substr(i * 4, 4).split("")) buf = (buf << 6) + map[char];
      ret.writeByte(buf >>> 16);
      ret.writeShort(buf);
     }
     return ret;
    }
    

    您可以简单地缩短函数名并取一个较小的图像…或使用 ColorTransform ConvolutionFilter 在一个图像而不是四个图像上…或者将图像编译成SWF以获得较小的总体尺寸…或者缩短函数名长度…

    所以,除非你计划使用MBS数据,否则这是一种方法…