2015-08-03 24 views
9

Tôi đang sử dụng lớp Trình tải xuống để nhận tệp lớn từ máy chủ IIS trên WS2012 và xử lý tiến trình tải xuống.Tải xuống tệp AIR AS3 bị hỏng khi băng thông thấp

Nó hoạt động tốt, tuy nhiên khi băng thông của khách hàng quá bão hòa, sự kiện Progress không được kích hoạt nữa và sau một khoảng thời gian tải xuống chỉ dừng lại (sự kiện hoàn tất có vẻ được kích hoạt?), Mặc dù tải xuống chưa hoàn thành, để lại khách hàng với một tập tin bị hỏng.

tôi không thể tìm ra cách để giải quyết việc này, hoặc thậm chí những gì chiến lược tôi nên dùng về vấn đề này (kết thúc việc tải xuống và hiển thị một lỗi? Chờ cho băng thông sẵn có để có được mảnh tiếp theo của tôi byte?)

đây là lớp 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

Tôi không thể giải thích hành vi chỉ một số đề xuất để xử lý nó .. '.finish việc tải xuống và hiển thị lỗi? hoặc chờ sẵn sàng băng thông để nhận được các byte tiếp theo của tôi? 'Vâng tại sao không làm cả hai? Nếu xảy ra sự cố, hãy thông báo rằng ** "Lỗi mạng đã khiến tải xuống không hoàn chỉnh" ** tại thời điểm này hiển thị 2 nút: "Tiếp tục tải xuống" hoặc "Giữ lại nội dung tôi nhận được" .. Nếu bạn muốn tiếp tục, bạn có thể đọc ** [this] (http://richapps.de/resumable-downloads-with-air/) ** và ** [this also] (http://mariusht.com/blog/2010/03/10/resumable -file-downloader-simple-air-app /) ** ... –

+0

Tiếp tục quá trình tải xuống có vẻ tốt với tôi. Khi sự kiện hoàn thành được kích hoạt trước khi tệp hoàn tất tải xuống, tôi có thể thử tiếp tục tải xuống nhiều lần, và sau đó dừng lại nếu nó không hoạt động quá lâu. Tôi sẽ đánh giá cao nếu ai đó có thể chi tiết rằng trong một câu trả lời. –

+1

Có biến 'int' lưu trữ các tệp được mong đợi .. Khi sự kiện hoàn thành cháy hiện kiểm tra xem [download]' fileData.length' bằng 'expected_FileSize' .. Nếu ít thì thử lại cho đến khi bằng hoặc bất cứ điều gì là đủ tốt. Để nhận được từ số byte cuối cùng, bạn sử dụng "yêu cầu phạm vi" trong tiêu đề yêu cầu. Nó cũng được hiển thị ** [trong liên kết này] (https://suzhiyam.wordpress.com/tag/range-header-in-as3/) ** Nếu điều đó giúp bạn. Một cái gì đó như 'URLRequestHeader (" phạm vi "," byte = "+ startPOS +" - "+ endPOS);' trong đó startPOS là 'submitata.length + 1' và endPos là số tiền' expected_FileSize'. –

Trả lời

1

hãy thử một biến int mà các cửa hàng dự kiến ​​filesize ..

Khi tổ chức sự kiện cháy Hoàn bây giờ kiểm tra nếu [tải về] của bạn fileData.length bằng expected_FileSize.

Nếu ít thì thử lại cho đến khi bằng hoặc bất cứ điều gì là đủ tốt. Để nhận được từ số byte cuối cùng, bạn sử dụng "yêu cầu phạm vi" trong tiêu đề yêu cầu. Nó cũng được hiển thị trong liên kết này Nếu điều đó giúp bạn.

Thứ gì đó như URLRequestHeader("range","bytes="+startPOS+"-"+endPOS); trong đó startPOS là datata.length + 1 và endPos được mong đợi_FileSize số tiền.

Các vấn đề liên quan