Возврат строки байтов к ExternalInterface.call бросает ошибку

Я работаю над своим Downloadify проекта с открытым исходным кодом, и вплоть до сих пор он просто обрабатывает Строки возврата в ответ на ExternalInterface.call команды.

Я пытаюсь соединить использование тестового сценария JSZip и Downloadify вместе, при этом конечный результат состоит в том, что zip-файл создается динамично в браузере, затем сохранил к дисковому использованию FileReference.save. Однако это - моя проблема:

Библиотека JSZip может возвратить любого a base64 закодированная строка Zip или необработанная строка байтов. Проблема, если я возвращаю ту строку байтов в ответ на ExternalInterface.call команда, я получаю эту ошибку:

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

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 поскольку я должен был бы включать a base64 декодер в моем swf который увеличит его размер.

Наконец: Я не ищу генератор Zip AS3. Это обязательно для моего проекта выполнить ту часть в JavaScript

Я - по общему признанию не программист AS3 торговлей, поэтому если Вы должны еще детализировать сообщенный мне.

8
задан Amarghosh 21 January 2010 в 07:32
поделиться

2 ответа

Вы можете легко изменить это Regex для вашей цели.

use Test::More 0.88;

#Match any whole text that does not contain a string
my $re=qr/^(?:(?!ac).)*$/;
my $str='ab ac ad';

ok(!$str=~$re);

$str='ab af ad';
ok($str=~$re);

done_testing();
-121--3153543-

Когда данные возвращаются из JavaScript, вызывает сериализацию в строку XML. Таким образом, если «RAW String», возвращаемый jszip, будет включать символы, которые делают XML не действительны, что я думаю, что здесь происходит, вы получите такие ошибки.

То, что вы получаете в качестве возврата, на самом деле:

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

Представьте себе, что ваша возвратная строка включает в себя «<» CHAR - это сделает XML-недействительный, и трудно сказать, какие коды персонажей будут также перевести коды символов.

Вы можете узнать больше о формате XML внешнего API на Livedocs

3
ответ дан 6 December 2019 в 00:07
поделиться

Я думаю, что проблема вызвана тем, что 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 для меньшего общего размера ... или уменьшить длину имени функции ...

так что, если вы не планируете работать с мегабайтами данных, то это путь к ...

1
ответ дан 6 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: