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