2015-08-03 9 views
9

मैं डब्ल्यूएस2012 पर आईआईएस सर्वर से बड़ी फाइलें प्राप्त करने और डाउनलोड प्रगति को संभालने के लिए एक डाउनलोडर क्लास का उपयोग कर रहा हूं।बैंड एवि 3 फ़ाइल डाउनलोड होने पर एआईआर एएस 3 फ़ाइल डाउनलोड दूषित हो गया है

यह ठीक काम करता है, हालांकि जब ग्राहक की बैंडविड्थ बहुत संतृप्त होती है, तो प्रगति की घटनाओं को अब और नहीं निकाल दिया जाता है और डाउनलोड के बावजूद डाउनलोड पूरी तरह बंद हो जाता है (पूर्ण घटना ट्रिगर होती है?), डाउनलोड होने के बावजूद अधूरा, क्लाइंट को दूषित फ़ाइल से छोड़कर।

मैं बाहर यह कैसे हल करने के लिए, या भी क्या रणनीति मैं इस समस्या पर ले जाना चाहिए (डाउनलोड समाप्त करने और एक त्रुटि प्रदर्शित? बैंडविड्थ उपलब्धता के लिए प्रतीक्षा करें बाइट्स की मेरी अगली टुकड़ा पाने के लिए?)

नहीं पा सके

यहाँ .. Downloader.as वर्ग

public class Downloader extends EventDispatcher 
{ 
    [Event(name="DownloadComplete", type="DownloadEvent")] 

    public static var spd:int = 0; 
    private var file:File; 
    private var fileStream:FileStream; 
    private var url:String; 
    private var urlStream:URLStream; 

    var mc_background:MovieClip; 
    var howManyTimes:Number = 3; //How many times per second the download speed will be traced 
    var bytesLoaded:Number = 0; //don't change, necessary for calculation 
    var lastTime:int = 0; //don't change, necessary for calculation 


    private var waitingForDataToWrite:Boolean = false; 

    public function Downloader(s:MovieClip) 
    { 
     mc_background = s; 

     lastTime = getTimer(); 
     urlStream = new URLStream(); 

     urlStream.addEventListener(Event.OPEN, onOpenEvent); 
     urlStream.addEventListener(ProgressEvent.PROGRESS, onProgressEvent); 
     urlStream.addEventListener(Event.COMPLETE, onCompleteEvent); 

     fileStream = new FileStream(); 
     fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler) 

    } 

    public function download(formUrl:String, toFile:File):void { 
     this.url = formUrl; 
     this.file = toFile; 
     mc_background.pb.file_txt.text = file.name; 
     fileStream.openAsync(file, FileMode.WRITE); 
     urlStream.load(new URLRequest(url)); 
    } 

    private function onOpenEvent(event:Event):void { 
     waitingForDataToWrite = true; 

     dispatchEvent(event.clone()); 
    } 

    private function onProgressEvent(event:ProgressEvent):void { 
     var time:int = getTimer(); 
     if(time - lastTime >= (1000/howManyTimes)) 
     { 
      var kiloBytes:Number = (event.bytesLoaded - bytesLoaded)/1000; 
      var timeInSecs:Number = (time - lastTime)/1000; 

      var kbsPerSecVal:Number = Math.floor(kiloBytes/timeInSecs); 
      trace(kbsPerSecVal + " kbs/s"); 

      mc_background.pb.speed_txt.text = kbsPerSecVal + " kbs/s"; 
      bytesLoaded = event.bytesLoaded; 
      lastTime = getTimer(); 
     } 
     if(waitingForDataToWrite){ 
      writeToDisk(); 
      dispatchEvent(event.clone()); 
     } 
    } 

    private function writeToDisk():void { 
     var fileData:ByteArray = new ByteArray(); 
     urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); 
     fileStream.writeBytes(fileData,0,fileData.length); 
     waitingForDataToWrite = false; 

     dispatchEvent(new DataEvent(DataEvent.DATA)); 
    } 

    private function writeProgressHandler(evt:OutputProgressEvent):void{ 
     waitingForDataToWrite = true; 
    } 

    private function onCompleteEvent(event:Event):void { 
     if(urlStream.bytesAvailable>0) 
      writeToDisk(); 
     fileStream.close(); 

     fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler); 

     dispatchEvent(event.clone()); 
     // dispatch additional DownloadEvent 
     dispatchEvent(new DownloadEvent(DownloadEvent.DOWNLOAD_COMPLETE, url, file)); 
    } 

} 
+3

मैं व्यवहार को समझाने के लिए केवल कुछ सुझावों को समझ नहीं सकता .. '.. डाउनलोड को समाप्त करें और एक त्रुटि प्रदर्शित करें? या बाइट्स के अगले टुकड़े पाने के लिए बैंडविड्थ उपलब्धता की प्रतीक्षा करें? 'ठीक है क्यों नहीं? यदि कोई समस्या है, तो यह कहते हुए कि "एक नेटवर्क त्रुटि ने अपूर्ण डाउनलोड किया है" ** इस बिंदु पर 2 बटन दिखाएं: "डाउनलोड फिर से शुरू करें" या "मुझे जो मिला है उसे रखें" .. यदि आप फिर से शुरू करना चाहते हैं तो आप पढ़ सकते हैं ** [यह] (http://richapps.de/resumable-downloads-with-air/) ** और ** [यह भी] (http://mariusht.com/blog/2010/03/10/resumable -फाइल-डाउनलोडर-सरल-एयर-ऐप /) ** ... –

+0

डाउनलोड को फिर से शुरू करना मेरे लिए अच्छा लगता है। जब फ़ाइल को डाउनलोड करने से पहले पूरी घटना निकाल दी जाती है, तो मैं कई बार डाउनलोड को फिर से शुरू करने का प्रयास कर सकता हूं, और फिर इसे बहुत लंबे समय तक विफल होने पर रोक दें। अगर कोई उत्तर में किसी को विस्तार से बता सकता है तो मैं सराहना करता हूं। –

+1

एक 'int' वैरिएबल है जो अपेक्षित फाइलसाइज स्टोर करता है .. जब ईवेंट पूर्ण आग लगती है तो जांचें कि क्या आपकी [डाउनलोड] 'fileData.length'' expected_FileSize' के बराबर है .. यदि कम है तो बराबर या फिर भी पर्याप्त अच्छा होने तक पुनः प्रयास करें। अंतिम बाइट्स राशि से प्राप्त करने के लिए आप अनुरोध हेडर में "रेंज अनुरोध" का उपयोग करते हैं। यह भी दिखाया गया है ** [इस लिंक में] (https://suzhiyam.wordpress.com/tag/range-header-in-as3/) ** यदि यह आपकी मदद करता है। कुछ 'URLRequestHeader ("रेंज", "बाइट्स =" + startPOS + "-" + endPOS);' जहां startPOS 'दायरताटा। लम्बाई + 1' है और endPos 'expected_FileSize' राशि है। –

उत्तर

1

है किसी पूर्णांक चर का प्रयास करें दुकानों की उम्मीद है कि फ़ाइल आकार

घटना पूर्ण आग अब की जांच करते हैं, तो आपकी [डाउनलोड] fileData.length expected_FileSize के बराबर है।

यदि कम हो तो बराबर या जो भी पर्याप्त हो, फिर से प्रयास करें। अंतिम बाइट्स राशि से प्राप्त करने के लिए आप अनुरोध हेडर में "रेंज अनुरोध" का उपयोग करते हैं। यह इस लिंक में भी दिखाया गया है यदि यह आपकी मदद करता है।

कुछ URLRequestHeader("range","bytes="+startPOS+"-"+endPOS); जहां startPOS दायरता है। लम्बाई + 1 और एंडपोज़ अपेक्षित है। फ़ाइल आकार।

संबंधित मुद्दे