1

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

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

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

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

有没有更好的解决方案来解决这个问题,而无需离开闪存来获取这些文件的大小?

4

4 回答 4

2

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

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

(查看第 9.4 节 HEAD)

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

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

迈克室

网格@adobe.com

于 2008-09-15T22:32:50.947 回答
1

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

var 套接字:套接字 = 新套接字();
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));
}
于 2008-09-16T00:06:25.140 回答
0

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

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

于 2008-09-16T02:42:44.857 回答
0

以下仅用于示例目的。在实际情况下,我不会使用 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();
于 2008-09-24T08:28:06.167 回答