Получение файлов нескольких размеров для прелоадера

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Хорошо, в настоящее время мой SWF-файл обращается к php-файлу, который находит все указанные мной файлы, складывает их размеры и возвращает их объединенные размеры как одно число.Затем я использую это число с прослушивателем ProgressEvent, чтобы определить текущий процент загрузки файлов для этого конкретного раздела веб-сайта.

Довольно просто, правда?Что ж, теперь об использовании этого файла PHP не может быть и речи, и я пытаюсь сделать все внутри SWF вместо того, чтобы обращаться к внешнему сценарию, чтобы получить нужные мне числа.

Есть ли хороший способ узнать размер файла ПЕРЕД тем, как я начну загружать его во флэш-память?Мне действительно нужно, чтобы предварительный загрузчик был от 0 до 100%, поэтому мне нужно общее количество байтов, которые я буду загружать, прежде чем он действительно начнется.

Одна из моих мыслей заключалась в том, чтобы просто пройтись по массиву, содержащему URL-адреса файлов, начать их загрузку, получитьTotalBytes без отображения какой-либо загрузки, прекратить загрузку на первом такте, сложить все эти общие числа в байтах, а затем начать фактический процесс загрузки.Этот метод кажется очень уродливым, и это будет огромная трата времени, поскольку каждый раз, когда пользователь нажимает на предзагрузчик на сайте, ему, вероятно, потребуется секунда или две, чтобы просмотреть все файлы, найти их общее количество и затем начать загрузку.

Есть ли лучшее решение этой проблемы, не выходя за пределы флэш-памяти, чтобы получить размер этих файлов?

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

Решение

Вы можете отправить HTTP-запрос HEAD на сервер для получения файлов.Это вернет информацию заголовка (включая размер файла), но не сам файл.Затем вы можете сделать запрос GET для загрузки файлов.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

(Ознакомьтесь с разделом 9.4 HEAD)

Я бы, вероятно, сделал двухуровневый индикатор выполнения (с двумя индикаторами выполнения).Один показывает общий прогресс (от 0 до 100%), а другой — прогресс каждого файла (по мере загрузки каждого файла).

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

Майк Чемберс

mesh@adobe.com

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

Идея Майка Чембера вам поможет, но она все равно будет медленнее, чем использование чего-то на стороне сервера, поскольку вам все равно придется делать запрос для каждого файла.По сути, это то же самое, что вы говорите сами, но когда вы явно запрашиваете заголовки, это будет немного быстрее.Используйте сокет для выполнения запроса:

var socket : Socket = new Socket( );
socket.addEventListener( Event.CONNECT, connectHandler );
socket.addEventListener( ProgressEvent.SOCKET_DATA, dataHandler );
socket.connect( "yourserver.com", 80 );

function connectHandler( event : Event ) : void {
    var headers : String = "HEAD yourfilename.ext http/1.1\r\n";
    headers += "Host: yourserver.com\r\n";
    headers += "\r\n\r\n";
    socket.writeUTFBytes( headers );
    socket.flush( );
}

function dataHandler( event : ProgressEvent ) : void {
    trace( "Received headers\n" );
    trace( socket.readUTF( socket.bytesAvailable ) );
}

Если абсолютно необходимо контролировать загрузку файлов, то я считаю, что предложение Майка Чемберса сделать запрос HTTP HEAD — это то, что вам нужно.

Однако, если нет веских причин не делать этого, я бы просто начал загружать все файлы одновременно и получал размеры файлов из метода getBytesTotal каждого файла.Поскольку Flash получает свой сетевой стек от браузера, количество файлов, фактически загружаемых одновременно, будет соответствовать (определяемым пользователем) настройкам браузера.

Нижеследующее приведено только в качестве примера.В реальном случае я бы не использовал таймер, у меня был бы массив или объект XML для перебора с помощью цикла for, несмотря на то, что он отлично работает, и, по сути, как только вы достигнете конца цикла (например,if(i == (length - 1)) пусть вызывает функцию, которая запускает фактическую предварительную загрузку теперь, когда у нас есть общая сумма.Теперь мы снова проходим по массиву или XML-объекту, но на этот раз мы делаем это только после загрузки каждого ресурса, а не в цикле for.Затем этот асинхронный метод может сравнить, сколько данных он загрузил, и разделить его на ранее найденное общее количество, что даст вам процент.

var totalBytes:Number = 0;

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest();
request.url = 'badfish.jpg';

var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER, onTimer);

function onTimer(e:TimerEvent)
{
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
function onProgress(e:ProgressEvent):void
{
    totalBytes+=e.bytesTotal;
    trace(e.bytesTotal,totalBytes);
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
}

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