Мда... Я совершенно не собирался писать про указанную в заголовке тему, но... почему-то многие заходят на этот блог именно по этому запросу (?!). Значит надо написать. Нехорошо обманывать ожидания людей :-)
Итак, перед нами стоят две задачи: загрузка и сохранение текстового файла в локальной файловой системе средствами языка ActionScript 3.0 (для ActionScript 2.0 данные задачи неактуальны... в силу их неосуществимости). Давайте последовательно рассмотрим обе эти задачи:
1.) Загрузка текстового файла в флеш-ролик с компьютера пользователя средствами AS 3.0.
Как это происходит?
Для того, чтобы что-то (текстовый файл, изображения) загрузить с компьютера пользователя в флеш-ролик, необходима воля пользователя. Без активности пользователя загрузка невозможна (что вполне оправдано соображениями безопасности). Пользователь нажимает кнопку мышки или клавишу клавиатуры и появляется диалоговое окно:
Через это диалоговое окно пользователь выбирает тот файл, который ему надо загрузить, а потом подтверждает свой выбор. Файл загружается.
На языке ActionScript 3.0 это выглядит примерно следующим образом...
Код ActionScript 3.0:
/*
создаём объект класса FileReference
именно класс FileReference обеспечивает загрузку/сохранение файлов в AS 3.0
*/
var fileReferenceLoad:FileReference = new FileReference();
/*
отслеживаем момент, когда пользователь выбирает файл для загрузки
*/
fileReferenceLoad.addEventListener(Event.SELECT, onFileSelect);
/*
кнопка для загрузки файлов
*/
btn.addEventListener(MouseEvent.CLICK, onClick);
/*
функция, вызываемая при клике на кнопке загрузки
*/
function onClick(event:MouseEvent):void
{
/*
открываем окно, в котором выбираем файл для загрузки в флеш-ролик
*/
fileReferenceLoad.browse();
}
/*
функция, которая вызывается тогда, когда пользователь выбрал файл для загрузки в флеш-ролик
*/
function onFileSelect(event:Event):void
{
/*
отслеживаем момент, когда файл полностью загружен
*/
fileReferenceLoad.addEventListener(Event.COMPLETE, onComplete);
/*
загружаем ранее выбранный пользователем файл
*/
fileReferenceLoad.load();
}
/*
функция, которая вызывается по завершению загрузки файла в флеш-ролик
*/
function onComplete(event:Event):void
{
/*
файл мы получаем в виде ByteArray - массива двоичных данных
*/
var byteArray:ByteArray = ByteArray(fileReferenceLoad.data);
/*
превращаем ByteArray в текст и присваиваем полученный текст нашему текстовому полю
*/
txtField.text = byteArray.readUTFBytes(byteArray.bytesAvailable);
}
где:
btn - это кнопка в флеш-ролике, которую надо нажать пользователю, чтобы начать загрузку текстового файла;
txtField - это динамическое текстовое поле, в которое загружается текст из текстового файла.
2.) Сохранение текстового файла на компьютере пользователя средствами AS 3.0.
Тут будет по-проще...
Код ActionScript 3.0:
/*
создаём объект FileReference
*/
var fileReferenceSave:FileReference = new FileReference();
/*
кнопка для сохранения файлов
*/
btn.addEventListener(MouseEvent.CLICK, onClick);
/*
функция, вызываемая при клике на кнопке сохранения
*/
function onClick(event:MouseEvent):void
{
/*
перегоняем текст в ByteArray (массив двоичных данных)
*/
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTFBytes(txtField.text);
/*
сохраняем файл на компьютере пользователя
*/
fileReferenceSave.save(byteArray, "mytxt.txt");
}
Вот и всё!
Хотя, конечно, приведённый мною код - это максимально упрощённый случай. Ведь мы даже не отслеживаем ошибки (впрочем, не так часто и возникающие) и не используем много других полезных свойств и событий FileReference. Но и этот код вполне работоспособен.
А теперь давайте закрепим материал и создадим примитивный текстовый редактор. У этого текстового редактора будет возможность загрузки-сохранения текста и текстовое поле, в котором текст можно будет изменить. Чтобы упростить себе жизнь, я для создания интерфейса этого текстового редактора воспользуюсь библиотекой компонентов MiniUI. Благодаря этому наш редактор будет создаваться исключительно кодом ActionScript...
Код ActionScript 3.0:
/*
==============================
импорт классов
==============================
*/
/*
классы, которые нам понадобятся для загрузки/сохранения данных
*/
import flash.net.FileReference;
import flash.utils.ByteArray;
import flash.events.*;
/*
импорт компонентов
*/
import sliz.miniui.Input;
import sliz.miniui.Button;
/*
==============================
текстовое поле
==============================
*/
var txtField:Input = new Input("","",this,null,50,50,300,300,true);
/*
==============================
загрузка данных
==============================
*/
/*
создаём объект класса FileReference
именно класс FileReference обеспечивает загрузку/сохранение файлов в AS 3.0
*/
var fileReferenceLoad:FileReference = new FileReference();
/*
отслеживаем момент, когда пользователь выбирает файл для загрузки
*/
fileReferenceLoad.addEventListener(Event.SELECT, onFileSelect);
/*
кнопка "load"
*/
new Button(" - load - ",400,100,this,load_file);
/*
функция, вызываемая при клике на кнопке "load"
*/
function load_file(event:Event):void
{
/*
открываем окно, в котором выбираем файл для загрузки в флеш-ролик
*/
fileReferenceLoad.browse();
}
/*
функция, которая вызывается тогда, когда пользователь выбрал файл для загрузки в флеш-ролик
*/
function onFileSelect(event:Event):void
{
/*
отслеживаем момент, когда файл полностью загружен
*/
fileReferenceLoad.addEventListener(Event.COMPLETE, onComplete);
/*
загружаем ранее выбранный пользователем файл
*/
fileReferenceLoad.load();
}
/*
функция, которая вызывается по завершению загрузки файла в флеш-ролик
*/
function onComplete(event:Event):void
{
/*
файл мы получаем в виде ByteArray - массива двоичных данных
*/
var byteArray:ByteArray = ByteArray(fileReferenceLoad.data);
/*
превращаем ByteArray в текст и присваиваем полученный текст нашему текстовому полю
*/
txtField.text = byteArray.readUTFBytes(byteArray.bytesAvailable);
}
/*
==============================
сохранение данных
==============================
*/
/*
создаём объект FileReference
*/
var fileReferenceSave:FileReference = new FileReference();
/*
создаём кнопку "save"
*/
new Button(" - save - ",400,150,this,save_file);
/*
функция, вызываемая по клику на кнопке "save"
*/
function save_file(event:Event):void
{
/*
перегоняем текст в ByteArray (массив двоичных данных)
*/
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTFBytes(txtField.text);
/*
сохраняем файл на компьютере пользователя
*/
fileReferenceSave.save(byteArray, "mytxt.txt");
}
Получился простой текстовый редактор на ActionScript 3.0:
Конечно, это не Notepad++, но работает :-)
Скачать исходники к данному посту можно здесь (под Adobe Flash CS5.5).
Примечания:
[!] Flash корректно работает только с текстовыми файлами, имеющими кодировку utf-8.
[!] Имеются ограничения на размер загружаемых в флеш-ролик данных.
[!] Для корректной работы приведённых в этой статье примеров вам понадобится Flash Player 10 и выше.