Flash, доступ к totalBytes перед фактической загрузкой файла

StackOverflow https://stackoverflow.com/questions/600271

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Под загрузкой вы имеете в виду полную загрузку или вызов без загрузки?Если вызов загрузки приемлем, может оказаться полезным следующее.Событие прогресса дает общий размер входящих данных при первом срабатывании.Мы просто запускаем данное событие прогресса, берем общее значение текущего элемента загрузки и добавляем его в нашу собственную переменную _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);
        }
    }
}

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top