2010-05-23 32 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