2008-09-15 14 views
1

Tamam, şu anda SWF dosyamda belirttiğim tüm dosyaları bulup bulacağınız, boyutlarını bir araya getirecek ve birleşik boyutlarını tek bir numara olarak döndürecek bir php dosyasına ulaşıyor. Daha sonra bu numarayı, web sitesinin söz konusu bölümünün indirilmesinin mevcut yüzdesini belirlemek için bir ProgressEvent dinleyicisi ile kullanıyorum.Bir önyükleyici için birden çok dosya boyutu alma

Oldukça basit değil mi? Şu anda bu PHP dosyasını kullanarak sorularım var ve ihtiyacım olan numaraları almak için harici bir betiğe sahip olmak yerine SWF içindeki her şeyi yapmaya çalışıyorum.

Bir dosyanın boyutunu Flash'a yüklemeye başlamadan ÖNCE iyi bir yol var mı? Önceden% 0 ila% 100 ön yükleyici olmak için ön yükleyiciye ihtiyacım var, bu yüzden aslında başlamadan önce indireceğim toplam bayt sayısına ihtiyacım var.

Tek düşüncem, dosya URL'lerini barındıran diziden geçip, yüklemeyi başlatma, herhangi bir yükleme yapmadan getTotalBytes yüklemesi, ilk tıklatmadaki yükü öldürmesi, tüm bu toplam bayt sayılarını eklemesiydi. gerçek indirme işlemi. Bu yöntem çok çirkin görünüyor ve kullanıcı her zaman bir ön yükleyiciye sitede vurduğunda büyük bir zaman kaybı olacak, muhtemelen tüm dosyaları çalıştırmak, toplam bulmak ve daha sonra aslında indirmeye başlamak için bir veya iki saniye sürecek.

Bu dosyaların boyutlarını almak için flash dışına çıkmadan bu soruna daha iyi bir çözüm var mı?

cevap

2

Dosyalar için sunucuya bir HTTP HEAD isteği yapabilirsiniz. Bu, başlık dosyasını (dosya boyutu dahil) döndürür, ancak gerçek dosyayı döndürmez. Daha sonra dosyaları yüklemek için bir GET isteği yapabilirsiniz.

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

(bölüm 9.4 HEAD göz atın)

Ne yapmam muhtemelen olurdu (2 ilerleme çubukları ile) iki katmanlı ilerleme çubuğu bulunur. Biri genel ilerlemeyi (% 0 ila% 100) ve dosya başına bir ilerlemeyi gösterir (her dosya indirildikçe).

Bu şekilde, yüklenecek dosya sayısını bildiğiniz sürece, dosya boyutunu almak için önce sunucuya vurmak zorunda kalmadan toplam ilerlemeyi yapabilirsiniz.

mike odaları

[email protected]

1

Mike Dairenin fikri size yardımcı olacaktır ama yine de yine her dosya için bir istek yapmak gerekecek, çünkü bir şey serverside kullanmaktan daha yavaş olacaktır. Esasen kendinizin söylediklerinin aynısı, ama başlıkları açıkça sorduğunuzda biraz daha hızlı olacak. istek yapmak için bir yuva kullanın:

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

o dosyaları yüklenir nasıl kontrol etmek kesinlikle gerekliyse, o zaman ben bir HTTP HEAD isteği yapmak için Mike Chambers' öneri gitmek için yol olduğuna inanıyoruz.

Ancak, iyi bir neden olmadığı sürece, tüm dosyaları bir kerede yüklemeye başlayacağım ve dosya boyutlarını her dosyanın getBytesTotal yönteminden aldım. Flash, ağ yığınını tarayıcıdan aldığından, aslında aynı anda yüklenen dosyaların sayısı (kullanıcı tanımlı) tarayıcı ayarlarına uygun olacaktır.

0

Aşağıdakiler sadece örnek amaçlıdır.Gerçek bir durumda Timer'i kullanmazdım, bir döngü ile bir döngü veya XML nesnesi olurdum, ne olursa olsun harika çalışır ve temel olarak döngünüzün sonuna geldiğinizde (örn. (I == (uzunluk - 1))) asıl ön yüklemeyi başlatan işlevselliği şimdi toplamımıza sahip olacak şekilde çağırsın.Şimdi dizi veya XML nesnesini tekrarlamak istiyoruz, ancak bu sefer her varlığa bir kez değil, bir kez yüklendikçe . Bu asenkron yöntemi, daha sonra size yüzdesini veren toplam bulundu orada oturmak ve önceki tarafından dolu ne kadar veri karşılaştırmak ve o bölebilirsiniz.

 
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

Evet Sorumun son paragraf düşünce süreci olarak bu fikri vardı zamanlayıcı yerine sadece ihtiyaç duyduğum tüm dosyalar arasında dolaşıp, önerdiğin şeye benzer şekilde ekledim, neyse ki sunucu sid Çalıştığımıza dair bir senaryo, bu yüzden bunu yapmaktan kaçındım. – vanhornRF