8

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

我正在尝试使用JSZip和 Downloadify 组合一个测试用例,最终结果是在浏览器中动态创建一个 Zip 文件,然后使用FileReference.save. 但是,这是我的问题:

JSZip 库可以返回base64Zip 的编码字符串或原始字节字符串。问题是,如果我返回该字节字符串以响应ExternalInterface.call命令,我会收到此错误:

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

动作脚本 3:

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

wherequeue_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 程序员,所以如果您需要更多详细信息,请告诉我。

4

2 回答 2

3

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

你得到的回报实际上是:

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

想象一下您的返回字符串包含一个“<”字符 - 这将使 xml 无效,并且很难判断原始字节流也会翻译哪些字符代码。

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

于 2010-01-21T11:59:18.110 回答
1

我认为问题是由以下事实引起的,即 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;
}

您可以简单地缩短函数名称并拍摄更小的图像...或在一个图像上使用ColorTransformConvolutionFilter而不是四个...或将图像编译为 SWF 以获得更小的整体尺寸...或减少函数名称长度...

因此,除非您打算使用 MB 的数据,否则这是要走的路……

于 2010-01-21T13:41:22.587 回答