关于闪存:为预加载器获取多个文件大小

关于闪存:为预加载器获取多个文件大小

Getting multiple file sizes for a preloader

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

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

在开始将文件加载到Flash中之前,是否有任何好的方法来获取文件的大小?我真的需要预加载器是0到100%的预加载器,因此我需要在实际启动之前要下载的字节总数。

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

是否有更好的解决方案来解决这些问题?


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

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

(查看第9.4 HEAD部分)

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

这样,只要您知道要加载的文件数,就可以完成总进度,而不必先点击服务器即可获取文件大小。

麦克房间

mesh@adobe.com


Mike Chamber的想法将为您提供帮助,但它仍然比在服务器端使用慢,因为无论如何您都必须为每个文件提出请求。基本上与您自己说的相同,但是当您明确要求标题时,它会稍微快一些。使用套接字执行请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var socket : Socket = new Socket( );
socket.addEventListener( Event.CONNECT, connectHandler );
socket.addEventListener( ProgressEvent.SOCKET_DATA, dataHandler );
socket.connect("yourserver.com", 80 );

function connectHandler( event : Event ) : void {
    var headers : String ="HEAD yourfilename.ext http/1.1\
\
";
    headers +="Host: yourserver.com\
\
";
    headers +="\
\
\
\
";
    socket.writeUTFBytes( headers );
    socket.flush( );
}

function dataHandler( event : ProgressEvent ) : void {
    trace("Received headers\
" );
    trace( socket.readUTF( socket.bytesAvailable ) );
}

以下仅出于示例目的。在实际情况下,我不会使用Timer,我将使用一个数组或XML对象使用for循环进行迭代,无论它的效果如何,并且基本上在您到达循环结束时(例如if(i ==(length-1 ))现在有了总数,就调用了开始实际预加载的功能,现在我们再次遍历数组或XML对象,但是这次仅在加载每个资产后执行,而不是在for循环中然后,该异步方法可以坐在那里,比较它已加载的数据量,然后将其除以较早发现的总数,从而得出您的百分比。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var totalBytes:Number = 0;

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest();
request.url = 'badfish.webp';

var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER, onTimer);

function onTimer(e:TimerEvent)
{
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
function onProgress(e:ProgressEvent):void
{
    totalBytes+=e.bytesTotal;
    trace(e.bytesTotal,totalBytes);
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
}

timer.start();

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

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


推荐阅读

    linux文件复制的命令?

    linux文件复制的命令?,系统,文件,命令,目录,源文件,基本知识,位置,目标,选

    linux复制命令文件?

    linux复制命令文件?,系统,文件,命令,目录,基本知识,源文件,目标,文件夹,路

    linux下文件均分命令?

    linux下文件均分命令?,管理,情况,系统,工作,信息,地址,命令,目录,单位,设备,L

    linux查文件数量命令?

    linux查文件数量命令?,系统,数据,电脑,命令,文件,信息,代码,对比,软件,第三,l

    linux命令去重文件?

    linux命令去重文件?,系统,工作,命令,信息,数据,环境,代码,文件,目录,操作,Lin

    linux匹配文件名命令?

    linux匹配文件名命令?,系统,时间,发行,位置,工具,软件,名称,盘后,电脑,盘中,l

    改文件名linux命令?

    改文件名linux命令?,名字,软件,文件,命令,位置,系统,文件名,目录,指令,方面,l

    linux命令文件加锁?

    linux命令文件加锁?,数据,密码,系统,设备,代码,地址,名单,信息,数字,统一,请

    linux拼接文件命令?

    linux拼接文件命令?,文件,数据,命令,代码,时间,信息,系统,情况,管理,标准,Lin

    linux文件常用命令?

    linux文件常用命令?,工作,地址,信息,系统,命令,目录,标准,情况,管理,常用命

    文件写入linux命令?

    文件写入linux命令?,文件,命令,状态,系统,名称,时间,首次,数据,数字,内容,在l

    linux命令写满文件?

    linux命令写满文件?,地址,工作,命令,系统,管理,文件,目录,标准,电脑,信息,Lin

    文件夹排序linux命令?

    文件夹排序linux命令?,系统,数字,信息,工作,时间,命令,管理,设备,单位,工具,

    linux命令匹配数字?

    linux命令匹配数字?,数字,档案,位置,环境,名字,较大,系统,权限,命令,用户,Lin

    linux权限数字命令?

    linux权限数字命令?,数字,系统,地址,权限,命令,标准,情况,管理,基础,文件,lin

    linux打开文件夹命令?

    linux打开文件夹命令?,工作,系统,信息,命令,图片,文件,管理,发行,名字,名称,

    linux上清空文件命令?

    linux上清空文件命令?,系统,命令,文件夹,名字,档案,文件,目录,方法,终端,指

    linux中历史命令文件?

    linux中历史命令文件?,系统,地址,信息,数字,时间,命令,数据,环境,历史,文件,l

    linux命令拷贝文件?

    linux命令拷贝文件?,系统,文件,命令,目录,情况,源文件,目标,文件夹,选项,语

    linux比对文件命令?

    linux比对文件命令?,系统,对比,第一,管理,工作,命令,文件,网络,名称,标准,lin