Обозреватель

Observer

среда, 18 февраля 2009 г.

Оригинал. No Title flash.

Как отформатировать размер файла
Для этой задачи я взял пример кода из интернета и переписал под Action Script 3. Получился метод который всегда выводит размер файла 4 значным числом, будь то 1,234 или 1000 и приставку kb, Mb, и т.д.


private function formatSizeValue( size : Number) : String
{

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

var longPB : Number = 1024 * 1024 * 1024 * 1024 * 1024;
var longTB : Number = 1024 * 1024 * 1024 * 1024;
var longGB : Number = 1024 * 1024 * 1024;
var longMB : Number = 1024 * 1024;
var longKB : Number = 1024;

var byteSize : String;
var displayNumber : Number;

Дальше выбикаем величину, в которой будем показывать размер

if (size >= longPB)
{
displayNumber = size / longPB;
byteSize = "Pb";
}
else if (size >= longTB)
{
displayNumber = size / longTB;
byteSize = "Tb";
}
else if (size >= longGB)
{
displayNumber = size /longGB;
byteSize = "Gb";
}
else if (size >= longMB)
{
displayNumber = size /longMB;
byteSize = "Mb";
}
else if (size >= longKB)
{
displayNumber = size / longKB;
byteSize = "kb";
}
else
{
displayNumber = size;
byteSize = "bytes";
}

// А здесь попрошу обратить внимание на метод toPrecision(n : int), вот он и делает число n значным, с округлением. Подробнее - читайте хелп :)

return displayNumber.toPrecision(4).toString() + ' ' + byteSize;

}


Как обнаружить, что файл был удален, или перемещен
Столкнулся с проблемкой что пользователь, открыв окошко для выбора файлов, начинает там наводить порядок. И бывали случаи когда этот файл был уже добавлен в список претендентов на закачку. И естественно, нажав upload происходил креш приложения.
Для этого я написал след метод:


private var _fr : FileReference;

public function get size() : uint
{

// Если фал был удален, то обращение к полю size у FileReference будет выдавать ошибку. Вот тут я и воспользовался try/catch

try {
return _fr.size;
}
catch(error : Error) {
dispatchEvent(new Event('itemWasDeleted') );
isError = true;
return 0;
}
return _fr.size;
}


Как раскрасить элементы листа в зависимости от местоположения
На этот вопрос развелась бурная дискуссия в чате UAFPUG. Внутри itemRenderer я изобрел след. велосипед:


return List(owner).itemRendererToIndex(this) % 2 ? 0xCCCCCC : 0xFFFFFF;

Rostislav Siryk: Тут лист используется только как ссылка на метод получения индекса из провайдера.

Если делать так, чтобы всего лишь разукрасить фон под itemRenderer - то лучше применить стиль alternatingItemColors. Но если вам нужно будет разукрасить внутренние компоненты, или сдвинуть их, то этот метод оптимальный.


Как получить ответ от сервера
Для этого я подсмотрел рецепт у http://flexcookbook.ru/ а именно: этот пост.

В интернете довольно много примеров по тому, как использовать FileReference для отправки файла на сервер, но мало где поясняется, как же все-таки отследить дальнейшую судьбу файла. Ведь событие Event.COMPLETE возникает всего лишь при удачной отправке файла на сервер. Как узнать, удалось ли вашему серверному приложению корректно обработать файл. Есть еще очень хорошее событие DataEvent.UPLOAD_COMPLETE_DATA которое возникает, если сервер вернул какие-то данные.

Итак, на COMPLETE у меня высвечивается Processing... а на UPLOAD_COMPLETE_DATA я выставляю галочку, что файл зааплодился успешно, и запрашиваю к нему путь через веб сервис.

Ну и напосдедок скажу, что отвечу на любые вопросы в комментариях :)