1

我正在寻找一种简单的方法来查找我计划加载的文件的文件大小,而无需加载它们。我基本上是在制作一批需要加载的文件,如果我能事先确定总负载有多大,那将非常有用。

Flash 中的 Loader 对象有一个 totalBytes 属性,但它只会在您已经加载文件时返回一个值。

4

6 回答 6

2

加载,你的意思是完全加载,还是没有加载调用?如果可以接受加载调用,则以下内容可能很有用。进度事件在第一次触发时给出传入数据的总大小。我们只是让给定的进度事件触发,获取当前加载项的总值并将其添加到我们自己的 _total 变量中;我们继续这样做,直到我们的数据提供者(数组、xml 等)为空。到最后,您将获得所有资产总额的总和。

package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.URLLoader;
    import flash.URLRequest;

    public class ExampleDocumentClass extends Sprite
    {
        private var _urlLoader:URLLoader;
        private var _loader:Loader;
        private var _request:URLRequest;
        private var _total:Number;
        private var _array:Array;

        public function ExampleDocumentClass():void
        {
            if(stage) _init;
            else addEventListener(Event.ADDED_TO_STAGE, _init);
        }
        private function _init(e:Event = null):void
        {
            _array = [{type:"nonDisplay", path:"path/to/file"},{type:"display", path:"path/to/file"}];
            _urlRequest = new URLRequest();

            //Non display asset
             _urlLoader = new URLLoader();
            _urlLoader.addEventListener(ProgressEvent.PROGRESS, _onProgress);

            //Display asset
            _loader = new Loader();

            loadAsset();
        }
        private function loadAsset():void
        {
            if(_array.length > 0)
            {
                var pObj:Object = _array[0];
                if(pObj.type == "nonDisplay")
                {
                    loadNonDisplayAsset(pObj.path);
                }
                else
                {
                    loadDisplayAsset(pObj.path);
                }
                //Remove this item from the array;
                _array.shift();
            }
        }
        private function loadNonDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _urlLoader.load(_urlRequest);
        }
        private function loadDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _onProgress);
            _loader.load(_urlRequest);
        }
        private function _onProgress(e:ProgressEvent):void
        {
            _total += e.bytesTotal;
            _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
            _urlLoader.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
        }
    }
}

因此,我们加载了一个足够长的资产,以将其总大小追加到我们自己的 _total 变量中,然后我们调用数组中的下一项并追加它的总和,直到数据提供者为空。显然,这可以使用 XML 来完成,或者无论如何,我在练习中使用了一个数组。

于 2009-03-02T23:58:07.303 回答
1

之前没有办法从Actionscript 3. 一个简单的解决方案是向服务器添加一个小脚本,该脚本扫描所有文件并将它们的名称和大小返回给 swf(作为JSONXML其他)。

于 2009-03-01T19:00:13.720 回答
0

在 ActionScript 中没有办法做到这一点。您需要一些服务器端代码来执行此操作。您可以创建一个采用文件名并返回总字节数的方法。

于 2009-03-01T19:01:31.143 回答
0

我不知道您将如何使用 actionscript(我不是 Guru)来执行此操作,但我的第一个猜测是使用 PHP 脚本(或您选择的任何其他脚本语言)来获取文件大小并返回值。

于 2009-03-01T19:02:00.157 回答
0

另一种(可能是矫枉过正)的方法是创建一些简单地向服务器询问文件头(包括文件大小)的东西。可以通过简单地开始下载文件并在您具有文件大小(应该非常快)或使用(如前所述)其他方式向服务器询问文件大小时关闭流来实现相同的目的(如果您正在加载多个文件,并且需要在加载之前知道文件大小)

于 2009-03-02T22:26:01.050 回答
0

我已经尝试了 Brian Hodge 提供的方法,以及另一种方法,其中我将变量(文件夹位置作为来自 XML 的字符串)发送到 PHP,以便获取特定文件夹中所有文件的组合大小并将数据返回到闪光。

我在预加载天堂之旅中遇到的一个主要问题是,Flash Player 在文件大小方面似乎产生了不一致的结果!即使我两次加载完全相同的文件,Flash 也会告诉我它们的大小不同……有时。

这也导致了备用(PHP)方法的问题,因为 PHP 脚本会产生(看似)准确的文件大小结果,这些结果与 Flash 产生的结果不一致,导致我的加载器达到 85% 或 128%,这取决于缓存和Flash的心情:/

我放弃了这两种方法,转而使用一个名为bulk-loader的好类,它允许对多个项目进行排队加载和进度跟踪,等等:D

请注意,它会显着增加您的 swf 文件大小......多么讽刺

于 2010-04-20T00:04:39.243 回答