8

私はオープンソースプロジェクトDownloadifyに取り組んでおり、これまではExternalInterface.callコマンドに応答して文字列を返すだけで処理していました。

JSZipとDownloadifyを一緒に使用してテストケースをまとめようとしています。その結果、Zipファイルがブラウザーで動的に作成され、を使用してディスクに保存されFileReference.saveます。しかし、これは私の問題です。

JSZipライブラリbase64は、Zipのエンコードされた文字列、または生のバイト文字列のいずれかを返すことができます。ExternalInterface.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_nameJSで正しいインスタンスを識別するために使用される文字列はどこにありますか。

JavaScript:

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

バイト文字列の代わりに通常の文字列を返すと、呼び出しは正しく機能します。サイズが大きくなるデコーダーbase64を含める必要があるため、使用を避けたいと思います。base64swf

最後に:私はAS3Zipジェネレーターを探していません。私のプロジェクトでは、その部分を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

問題の原因は、フラッシュが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;
}

関数名を短くして画像を小さくするか、4つではなく1つの画像を使用するColorTransformConvolutionFilter、画像をSWFにコンパイルして全体のサイズを小さくするか、関数名の長さを短くすることができます。

したがって、MBのデータを処理することを計画していない限り、これが方法です...

于 2010-01-21T13:41:22.587 に答える