Загрузка и сохранение текстовых файлов в ActionScript 3.0

Мда... Я совершенно не собирался писать про указанную в заголовке тему, но... почему-то многие заходят на этот блог именно по этому запросу (?!). Значит надо написать. Нехорошо обманывать ожидания людей :-)

Итак, перед нами стоят две задачи: загрузка и сохранение текстового файла в локальной файловой системе средствами языка 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:

Загрузить Adobe Flash Player

Конечно, это не Notepad++, но работает :-)

Скачать исходники к данному посту можно здесь (под Adobe Flash CS5.5).

Примечания:

[!] Flash корректно работает только с текстовыми файлами, имеющими кодировку utf-8.

[!] Имеются ограничения на размер загружаемых в флеш-ролик данных.

[!] Для корректной работы приведённых в этой статье примеров вам понадобится Flash Player 10 и выше.

Автор: admin

Дата добавления: 2012-02-05

Просмотров: 19051

Рейтинг поста: +26-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): Elena
Дата добавления: 2015-02-28
Высокооплачиваемая подработка в домашних условиях. Без навыков. Стабильный доход от 6тыс. руб. в день.
Перечисление средств ежедневно. Зарплата каждую неделю. Стабильно!
График работы, Вы устанавливаете самостоятельно, в пределах Ваших возможностей.
Все подробности у нас на сайте. http://u.to/L5GYCg
.
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-12-05
Никак. Из флеш-приложения название данного окна изменить нельзя.
Комментатор
Комментарий добавил(а): Илья
Дата добавления: 2013-12-05
Подскажите пожалуйста, как поменять заголовок окна, которое появляется для загрузки файла?
Это видимо окно windows, там пишется "Открыть", а мне нужно сделать "Выберите файл.
Комментатор
Комментарий добавил(а): Вася
Дата добавления: 2013-11-12
Вот спросишь и тут же сам найдёшь ответ. Жаль, что нет функции удаления коммента.
Комментатор
Комментарий добавил(а): Вася
Дата добавления: 2013-11-12
А возможно ли получить порядковый номер символа в ASCII? Например, нужно сдвинуть все символы, что имеются в документе, на 2-3 позиции по их порядковому номеру в ASCII. Допустим, А (192й номер по ASCII) смещается до Г (195й). И вот, чтобы их так смещать нужен доступ к их порядковому номеру по ASCII, которого я так и не найду. Извините, если сумбурно выражаюсь.
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-03-13
И в чём проблема? В AS 3.0 есть событие CHANGE для текстовых полей, которое возникает при изменении текста в поле ввода:

поле_ввода.addEventListener(Event.CHANGE,onChange);

function onChange(event:Event):void
{
ваш_код;
}


В AS 2.0 тоже есть аналог.
Комментатор
Комментарий добавил(а): Сергей
Дата добавления: 2013-03-13
Народ хоть вы помогите.
Нужна авто сумма. 10-ть позиций столбиком при вводе цен в каждую нужна в итоге авто сумма, без предварительного нажатия на "=" к примеру, так сказать суммирует онлайн.
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-03-02
> возможно ли сохранение без открытия диалогового окна

Нет, не возможно. И сделан это в целях безопасности.
Комментатор
Комментарий добавил(а): Вова
Дата добавления: 2013-03-02
возможно ли сохранение без открытия диалогового окна
Комментатор
Комментарий добавил(а): Людмила
Дата добавления: 2012-03-26
Странно, у меня все работает.
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Страница 1 из 2: 12
Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика