Flash,在实际加载文件之前访问totalBytes

时间:2009-03-01 18:50:07

标签: flash actionscript-3 loading

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

flash中的Loader对象有一个totalBytes属性,但只有在你加载文件时才会返回一个值。

6 个答案:

答案 0 :(得分:2)

加载后,您的意思是完全加载,还是没有加载调用?如果加载调用是可接受的,则以下内容可能很有用。 progress事件在第一次触发时提供传入数据的总大小。我们只是让一个给定的进度事件触发,取当前加载项的总值并将其添加到我们自己的_total变量中;我们继续这个,直到我们的dataprovider(array,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);
        }
    }
}

所以我们加载一个资产的时间足够长,以便将它的Size total附加到我们自己的_total变量,然后我们调用数组中的下一个项目并追加它的总数,直到数据提供者为空。显然这可以用XML来完成,或者你想要的,一个数组就是我用来练习的。

答案 1 :(得分:1)

无法从Actionscript 3之前获取文件的大小。一个简单的解决方案是向服务器添加一个小脚本,扫描所有文件并将其名称和大小返回给swf(如JSONXML或其他)。

答案 2 :(得分:0)

在ActionScript中无法执行此操作。您需要一些服务器端代码才能执行此操作。您可以创建一个采用文件名并返回总字节数的方法。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

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

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