Получение файлов разных размеров для предварительного загрузчика - PullRequest
1 голос
/ 16 сентября 2008

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 16 сентября 2008

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

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

(см. Раздел 9.4 ГОЛОВКА)

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

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

микрофонные камеры

mesh@adobe.com

1 голос
/ 16 сентября 2008

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

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 ) );
}
0 голосов
/ 24 сентября 2008

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

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

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

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