문제

좋습니다. 현재 SWF는 내가 지정한 모든 파일을 찾아서 크기를 더하고 결합된 크기를 하나의 숫자로 반환하는 PHP 파일을 실행하고 있습니다.그런 다음 ProgressEvent 리스너와 함께 이 숫자를 사용하여 웹 사이트의 특정 섹션에 대해 다운로드되는 파일의 현재 비율을 결정합니다.

아주 간단하죠?이제 해당 PHP 파일을 사용하는 것은 불가능하며 필요한 숫자를 얻기 위해 외부 스크립트를 실행하는 대신 SWF 내부에서 모든 작업을 수행하려고 합니다.

플래시에 파일을 로드하기 전에 파일 크기를 확인할 수 있는 좋은 방법이 있습니까?프리로더가 0~100% 프리로더가 되어야 하므로 실제로 시작하기 전에 다운로드할 총 바이트 수가 필요합니다.

제가 생각한 것 중 하나는 파일 URL이 포함된 배열을 살펴보고 로드를 시작하고 로드를 표시하지 않고 TotalBytes를 가져오고 첫 번째 틱에서 로드를 종료하고 총 바이트 수를 모두 더한 다음 실제 다운로드 프로세스를 시작하는 것이었습니다.이 방법은 매우 추악해 보이며 사용자가 사이트에서 프리로더를 실행할 때마다 모든 파일을 실행하고 전체 파일을 찾은 다음 실제로 다운로드를 시작하는 데 1~2초가 걸리기 때문에 엄청난 시간 낭비가 될 것입니다.

해당 파일의 크기를 얻기 위해 플래시 외부로 나가지 않고 이 문제에 대한 더 나은 솔루션이 있습니까?

도움이 되었습니까?

해결책

파일에 대해 서버에 HTTP HEAD 요청을 수행할 수 있습니다.그러면 헤더 정보(파일 크기 포함)가 반환되지만 실제 파일은 반환되지 않습니다.그런 다음 GET 요청을 만들어 파일을 로드할 수 있습니다.

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

(섹션 9.4 HEAD를 확인하세요)

아마도 내가 할 일은 2단계 진행률 표시줄(2개의 진행률 표시줄 포함)입니다.하나는 전체 진행률(0~100%)을 표시하고 다른 하나는 파일별 진행률(각 파일이 다운로드됨)을 표시합니다.

이렇게 하면 로드할 파일 수를 알고 있는 한 파일 크기를 얻기 위해 먼저 서버에 접속하지 않고도 전체 진행을 수행할 수 있습니다.

마이크 챔버

mesh@adobe.com

다른 팁

Mike Chamber의 아이디어가 도움이 되겠지만 어쨌든 각 파일에 대해 요청을 해야 하기 때문에 서버 측에서 무언가를 사용하는 것보다 여전히 느릴 것입니다.본질적으로 자신이 말하는 것과 동일하지만 명시적으로 헤더를 요청하면 약간 더 빨라집니다.소켓을 사용하여 요청을 수행합니다.

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 요청을 하라는 Mike Chambers의 제안이 좋은 방법이라고 생각합니다.

그러나 그렇게 하지 않을 타당한 이유가 없으면 모든 파일을 한 번에 로드하기 시작하고 각 파일의 getBytesTotal 메소드에서 파일 크기를 가져옵니다.Flash는 브라우저에서 네트워크 스택을 가져오므로 실제로 동시에 로드되는 파일 수는 (사용자 정의 가능한) 브라우저 설정을 따릅니다.

다음은 단지 예시를 위한 것입니다.실제 사례에서는 Timer를 사용하지 않을 것입니다. for 루프를 사용하여 반복할 배열 또는 XML 객체가 있을 것입니다. 작동 여부와 상관없이 기본적으로 루프의 끝에 도달하면(예: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