我正在寻找一种简单的方法来查找我计划加载的文件的文件大小,而无需加载它们。我基本上是在制作一批需要加载的文件,如果我能事先确定总负载有多大,那将非常有用。
Flash 中的 Loader 对象有一个 totalBytes 属性,但它只会在您已经加载文件时返回一个值。
我正在寻找一种简单的方法来查找我计划加载的文件的文件大小,而无需加载它们。我基本上是在制作一批需要加载的文件,如果我能事先确定总负载有多大,那将非常有用。
Flash 中的 Loader 对象有一个 totalBytes 属性,但它只会在您已经加载文件时返回一个值。
加载,你的意思是完全加载,还是没有加载调用?如果可以接受加载调用,则以下内容可能很有用。进度事件在第一次触发时给出传入数据的总大小。我们只是让给定的进度事件触发,获取当前加载项的总值并将其添加到我们自己的 _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 来完成,或者无论如何,我在练习中使用了一个数组。
之前没有办法从Actionscript 3
. 一个简单的解决方案是向服务器添加一个小脚本,该脚本扫描所有文件并将它们的名称和大小返回给 swf(作为JSON
或XML
其他)。
在 ActionScript 中没有办法做到这一点。您需要一些服务器端代码来执行此操作。您可以创建一个采用文件名并返回总字节数的方法。
我不知道您将如何使用 actionscript(我不是 Guru)来执行此操作,但我的第一个猜测是使用 PHP 脚本(或您选择的任何其他脚本语言)来获取文件大小并返回值。
另一种(可能是矫枉过正)的方法是创建一些简单地向服务器询问文件头(包括文件大小)的东西。可以通过简单地开始下载文件并在您具有文件大小(应该非常快)或使用(如前所述)其他方式向服务器询问文件大小时关闭流来实现相同的目的(如果您正在加载多个文件,并且需要在加载之前知道文件大小)
我已经尝试了 Brian Hodge 提供的方法,以及另一种方法,其中我将变量(文件夹位置作为来自 XML 的字符串)发送到 PHP,以便获取特定文件夹中所有文件的组合大小并将数据返回到闪光。
我在预加载天堂之旅中遇到的一个主要问题是,Flash Player 在文件大小方面似乎产生了不一致的结果!即使我两次加载完全相同的文件,Flash 也会告诉我它们的大小不同……有时。
这也导致了备用(PHP)方法的问题,因为 PHP 脚本会产生(看似)准确的文件大小结果,这些结果与 Flash 产生的结果不一致,导致我的加载器达到 85% 或 128%,这取决于缓存和Flash的心情:/
我放弃了这两种方法,转而使用一个名为bulk-loader的好类,它允许对多个项目进行排队加载和进度跟踪,等等:D
请注意,它会显着增加您的 swf 文件大小......多么讽刺