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

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

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

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

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

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

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
1
0
1 325
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

(См. Раздел 9.4 HEAD)

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

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

Майк Чемберс

[email protected]

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

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

Следующее приведено только для примера. В реальном случае я бы не стал использовать Timer, у меня был бы массив или объект 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();

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

vanhornRF 25.09.2008 22:20

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