2010-05-23 64 views

回答

3

您可以使用URLLoader並偵聽事件以檢查它是否加載,如果不是,可能是什麼問題。如果首先使用AIRMonitor來確保客戶端計算機處於聯機狀態,將會非常方便。

這是一類我開始寫來說明這個想法:

package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.events.HTTPStatusEvent; 
    import flash.events.IEventDispatcher; 
    import flash.events.IOErrorEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    /** 
    * ... 
    * @author George Profenza 
    */ 
    public class URLChecker extends EventDispatcher 
    { 
     private var _url:String; 
     private var _request:URLRequest; 
     private var _loader:URLLoader; 
     private var _isLive:Boolean; 
     private var _liveStatuses:Array; 
     private var _completeEvent:Event; 
     private var _dispatched:Boolean; 
     private var _log:String = ''; 

     public function URLChecker(target:IEventDispatcher = null) 
     { 
      super(target); 
      init(); 
     } 

     private function init():void 
     { 
      _loader = new URLLoader(); 
      _loader.addEventListener(Event.COMPLETE, _completeHandler); 
      _loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, _httpStatusHandler); 
      _loader.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorEventHandler); 
      _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _securityErrorHandler); 

      _completeEvent = new Event(Event.COMPLETE, false, true); 

      _liveStatuses = [];//add other acceptable http statuses here 
     } 

     public function check(url:String = 'http://stackoverflow.com'):void { 
      _dispatched = false; 
      _url = url; 
      _request = new URLRequest(url); 
      _loader.load(_request); 
      _log += 'load for ' + _url + ' started : ' + new Date() + '\n'; 
     } 

     private function _completeHandler(e:Event):void 
     { 
      _log += e.toString() + ' at ' + new Date(); 
      _isLive = true; 
      if (!_dispatched) { 
       dispatchEvent(_completeEvent); 
       _dispatched = true; 
      } 
     } 

     private function _httpStatusHandler(e:HTTPStatusEvent):void 
     { 
      /* comment this in when you're sure what statuses you're after 
      var statusesLen:int = _liveStatuses.length; 
      for (var i:int = statusesLen; i > 0; i--) { 
       if (e.status == _liveStatuses[i]) { 
        _isLive = true; 
        dispatchEvent(_completeEvent); 
       } 
      } 
      */ 
      //200 range 
      _log += e.toString() + ' at ' + new Date(); 
      if (e.status >= 200 && e.status < 300) _isLive = true; 
      else         _isLive = false; 
      if (!_dispatched) { 
       dispatchEvent(_completeEvent); 
       _dispatched = true; 
      } 
     } 

     private function _ioErrorEventHandler(e:IOErrorEvent):void 
     { 
      _log += e.toString() + ' at ' + new Date(); 
      _isLive = false; 
      if (!_dispatched) { 
       dispatchEvent(_completeEvent); 
       _dispatched = true; 
      } 
     } 

     private function _securityErrorHandler(e:SecurityErrorEvent):void 
     { 
      _log += e.toString() + ' at ' + new Date(); 
      _isLive = false; 
      if (!_dispatched) { 
       dispatchEvent(_completeEvent); 
       _dispatched = true; 
      } 
     } 

     public function get isLive():Boolean { return _isLive; } 

     public function get log():String { return _log; } 

    } 

} 

,這裏是一個基本的使用示例:

var urlChecker:URLChecker = new URLChecker(); 
urlChecker.addEventListener(Event.COMPLETE, urlChecked); 
urlChecker.check('wrong_place.url'); 

function urlChecked(event:Event):void { 
    trace('is Live: ' + event.target.isLive); 
    trace('log: ' + event.target.log); 
} 

的想法很簡單: 1.創建一個檢查 2.監聽COMPLETE事件(當結果爲 時觸發)3.在處理程序中檢查它是否存在並記錄它。

HTTP specs中,200面積看起來不錯,但取決於您加載的內容,您可能需要 來調整類。此外,您還需要更好地處理安全/跨域問題,但至少這是一個開始。

HTH

3

一個重要的考慮是喬治的回答冷落是URLRequestMethod。如果有人試圖驗證相當大的文件(例如媒體文件)的存在,而不僅僅是網頁,那麼您需要確保將的method屬性設置爲URLRequestMethod.HEAD

HTTP1.1 Protocol指出:

HEAD方法是相同,除了在應答服務器不能返回一個消息體得到的。

因此,如果你真的只想驗證URL的存在,這是要走的路。

對於那些誰需要的代碼闡明:

var _request:URLRequest = URLRequest(url); 
_request.method = URLRequestMethod.HEAD; // bandwidth :) 

否則,喬治的回答是一個很好的參考點。

注:這個特殊的URLRequestMethod只適用於AIR。

+0

是否有任何其他檢查方式是否有任何文件使用本地磁盤給定的地址。我的意思是,我沒有使用AIR,並想檢查一個「xml」文件,該文件應該與主swf位於同一個文件夾中...並且我不想採用ioerror,只是想使用嵌入式xml而不是具有簡單條件的外部xml。我只想檢查外部xml是否存在並使用它,否則使用嵌入的xml。 – 2014-03-12 12:35:31

+1

@AlobarNon,它聽起來像是在問一個完整的問題(不適合發表評論),而不是單純的澄清(適合評論)。我唯一的答案就是管理檢查非常大的文件,而不會無意下載它們。如果你正在處理XML,那可能不是這種情況。在這些答案中,觸發** IOError ** *是*你如何異步測試一個url。把它看作是你正在處理的另一個事件。但是,我幾年之後還沒有開發ActionScript,所以事情可能已經發生了變化。 – merv 2014-03-15 17:12:56

+0

不,我已經完成了你所說的,異步使用IOErrorEvent檢查,這已經解決了我的問題,非常感謝:) – 2014-03-17 08:08:36