【问题标题】:Getting multiple file sizes for a preloader为预加载器获取多个文件大小
【发布时间】:2010-09-09 05:09:03
【问题描述】:

好的,目前我有我的 SWF 访问一个 php 文件,该文件将查找我指定给它的所有文件,将它们的大小加在一起并将它们的组合大小作为一个数字返回。然后,我将此数字与 ProgressEvent 侦听器一起使用,以确定网站特定部分的当前文件下载百分比。

很简单吧?好吧,现在使用该 PHP 文件是不可能的,我正在尝试在 SWF 中执行所有操作,而不是让它通过外部脚本来获取我需要的数字。

在我开始将文件加载到闪存之前,有什么好的方法可以获取文件的大小吗?我真的需要预加载器是 0 到 100% 的预加载器,所以我需要在它实际开始之前我将下载的总字节数。

我的一个想法是遍历保存文件 URL 的数组,开始加载它们,getTotalBytes 不显示任何加载,在第一次滴答时终止加载,将所有这些总字节数相加,然后开始实际下载过程。这种方法看起来很丑陋,而且会浪费大量时间,因为每次用户在网站上点击预加载器时,可能需要一两秒钟来浏览所有文件,找到它们的总数,然后真正开始下载。

有没有更好的解决这个问题的方法,而不需要在闪存之外获取这些文件的大小?

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    您可以向服务器发出 HTTP HEAD 请求以获取文件。这将返回标题信息(包括文件大小),但不返回实际文件。然后您可以发出 GET 请求来加载文件。

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

    (查看第 9.4 节 HEAD)

    我可能会做的是一个两层进度条(带有 2 个进度条)。一个显示整体进度(0 到 100%),一个显示每个文件的进度(每个文件下载时)。

    这样,只要您知道要加载的文件数量,就可以完成总进度,而无需先访问服务器来获取文件大小。

    麦克室

    mesh@adobe.com

    【讨论】:

      【解决方案2】:

      Mike Chamber 的想法会对您有所帮助,但它仍然比使用服务器端的东西要慢,因为无论如何您都必须对每个文件提出请求。这与您自己所说的基本相同,但是当您明确要求标题时,它会稍微快一些。使用 Socket 进行请求:

      var socket : Socket = new Socket( );
      socket.addEventListener(Event.CONNECT, connectHandler);
      socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
      socket.connect("yourserver.com", 80);
      
      函数connectHandler(事件:事件):无效{
          var headers : String = "HEAD yourfilename.ext http/1.1\r\n";
          headers += "主机:yourserver.com\r\n";
          标题 += "\r\n\r\n";
          socket.writeUTFBytes(标头);
          socket.flush();
      }
      
      函数数据处理程序(事件:ProgressEvent):无效{
          跟踪(“接收到的标头\n”);
          跟踪(socket.readUTF(socket.bytesAvailable));
      }
      

      【讨论】:

        【解决方案3】:

        如果绝对有必要控制文件的加载方式,那么我相信 Mike Chambers 提出 HTTP HEAD 请求的建议是可行的方法。

        但是,除非有充分的理由不这样做,否则我会立即开始加载所有文件并从每个文件的 getBytesTotal 方法获取文件大小。由于 Flash 从浏览器获取其网络堆栈,实际同时加载的文件数将符合(用户可定义的)浏览器设置。

        【讨论】:

          【解决方案4】:

          以下内容仅用于示例目的。在实际情况下,我不会使用 Timer,我会有一个数组或 XML 对象来使用 for 循环进行迭代,不管它是否工作得很好,基本上一旦你到达循环的结尾(例如 if(i == (length - 1 )) 既然我们有了总数,就让它调用开始实际预加载的功能。现在我们再次遍历数组或 XML 对象,但这一次我们只在每个资产加载后才这样做,而不是在 for 循环中. 然后,此异步方法可以坐在那里比较它已加载的数据量,然后将其除以先前找到的总数,得出您的百分比。

          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); 函数 onTimer(e:TimerEvent) { loader.load(请求); loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); } 函数 onProgress(e:ProgressEvent):void { totalBytes+=e.bytesTotal; 跟踪(e.bytesTotal,totalBytes); loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); } 计时器.start();

          【讨论】:

          • 是的,我有这个想法作为我问题的最后一段思考过程,而不是计时器,尽管我只是遍历所有我需要的文件并将它们添加到类似于你建议的内容,幸运的是我们最终解决了服务器端脚本,所以我避免了这样做。
          猜你喜欢
          • 2010-10-22
          • 2016-07-08
          • 2019-12-08
          • 2020-05-24
          • 1970-01-01
          • 1970-01-01
          • 2013-06-29
          • 2012-06-15
          相关资源
          最近更新 更多