Flash, доступ к totalBytes до фактической загрузки файла - PullRequest
1 голос
/ 01 марта 2009

Я ищу простой способ найти размеры файлов, которые я планирую загрузить, еще не загружая их. Я в основном делаю пакет файлов, которые нужно загрузить, и было бы очень полезно, если бы я мог заранее определить, насколько большой будет общая нагрузка.

Объект Loader во флэш-памяти имеет свойство totalBytes, но оно будет возвращать значение только тогда, когда вы уже загружаете файл.

Ответы [ 6 ]

2 голосов
/ 03 марта 2009

Под загрузкой вы имеете в виду полностью загруженный или без вызова загрузки? Если вызов загрузки приемлем, может быть полезно следующее. Событие прогресса дает общий размер входящих данных при первом запуске. Мы просто позволяем заданному событию прогресса срабатывать, берем общее значение текущего элемента загрузки и добавляем его в нашу собственную переменную _total; Мы продолжаем это, пока наш поставщик данных (массив, xml и т. Д.) Не станет пустым. к концу у вас есть сумма всех ваших активов итогов.

package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.URLLoader;
    import flash.URLRequest;

    public class ExampleDocumentClass extends Sprite
    {
        private var _urlLoader:URLLoader;
        private var _loader:Loader;
        private var _request:URLRequest;
        private var _total:Number;
        private var _array:Array;

        public function ExampleDocumentClass():void
        {
            if(stage) _init;
            else addEventListener(Event.ADDED_TO_STAGE, _init);
        }
        private function _init(e:Event = null):void
        {
            _array = [{type:"nonDisplay", path:"path/to/file"},{type:"display", path:"path/to/file"}];
            _urlRequest = new URLRequest();

            //Non display asset
             _urlLoader = new URLLoader();
            _urlLoader.addEventListener(ProgressEvent.PROGRESS, _onProgress);

            //Display asset
            _loader = new Loader();

            loadAsset();
        }
        private function loadAsset():void
        {
            if(_array.length > 0)
            {
                var pObj:Object = _array[0];
                if(pObj.type == "nonDisplay")
                {
                    loadNonDisplayAsset(pObj.path);
                }
                else
                {
                    loadDisplayAsset(pObj.path);
                }
                //Remove this item from the array;
                _array.shift();
            }
        }
        private function loadNonDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _urlLoader.load(_urlRequest);
        }
        private function loadDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _onProgress);
            _loader.load(_urlRequest);
        }
        private function _onProgress(e:ProgressEvent):void
        {
            _total += e.bytesTotal;
            _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
            _urlLoader.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
        }
    }
}

Таким образом, мы загружаем актив достаточно долго, чтобы добавить его итоговое значение Size к нашей собственной переменной _total, а затем вызываем следующий элемент в массиве и добавляем его итоговое значение, пока поставщик данных не станет пустым. Очевидно, что это можно сделать с помощью XML, или, как вы хотите, массив - это то, что я использовал для упражнения.

1 голос
/ 01 марта 2009

Нет способа получить размер файла ранее от Actionscript 3. Простым решением было бы добавить на сервер небольшой скрипт, который сканирует все файлы и возвращает их имена и их размер в swf (как JSON или XML или как угодно).

0 голосов
/ 20 апреля 2010

Я экспериментировал с методом, предоставленным Брайаном Ходжем, а также с другим методом, в котором я отправлял переменные (расположения папок в виде строк из XML) в PHP, чтобы получить объединенный размер всех файлов в определенной папке и вернуть данные для Flash.

Одна из основных проблем, с которой я столкнулся на пути к предварительной загрузке рая, заключалась в том, что Flash Player, похоже, дает противоречивые результаты в отношении размера файла! Даже если я дважды загрузил одни и те же файлы, Flash скажет мне, что они были разных размеров ... иногда.

Это также вызвало проблемы с альтернативным (PHP) методом, так как PHP-скрипт будет производить (на первый взгляд) точные результаты по размеру файла, которые были бы несовместимы с теми, что были получены с помощью Flash, в результате чего загрузчик зависел до 85% или 128%, в зависимости о кешировании и настроении Флэша: /

Я отказался от обоих методов в пользу классного класса под названием массовый загрузчик , который позволяет загружать в очередь и отслеживать прогресс нескольких элементов и многое другое: D

Просто имейте в виду, что это значительно увеличит размер вашего файла SWF ... как иронично

0 голосов
/ 03 марта 2009

Другим (возможно, избыточным) способом было бы создать что-то, что просто запрашивает у сервера заголовки файла (включая размер файла). То же самое может быть достигнуто простым началом загрузки файла и закрытием потока, когда у вас есть размер файла (должен быть довольно быстрым), или наличием (как предлагалось ранее) какого-либо другого способа запроса у сервера размера файла (полезно Вы загружаете несколько файлов и должны знать размер файла перед загрузкой)

0 голосов
/ 01 марта 2009

Я не знаю, как бы вы сделали это с actionScript (я не гуру), но мое первое предположение - использовать PHP-скрипт (или любой другой язык сценариев по вашему выбору), чтобы получить размеры файлов и вернуть значения.

0 голосов
/ 01 марта 2009

Нет способа сделать это в ActionScript. Для этого вам понадобится код на стороне сервера. Вы можете создать метод, который принимает имя файла и возвращает общее количество байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...