플래시, 실제로 파일을로드하기 전에 TotalBytes에 액세스합니다
-
03-07-2019 - |
문제
나는 아직로드하지 않고로드 할 파일의 파일 크기를 찾는 간단한 방법을 찾고 있습니다. 기본적으로로드해야 할 파일 배치를 만들고 있으며 총 부하가 얼마나 큰지 사전에 결정할 수 있다면 매우 유용 할 것입니다.
Flash의 로더 객체에는 TotalBytes 속성이 있지만 이미 파일을로드 할 때만 값을 반환합니다.
해결책
로드함으로써, 당신은 완전히로드되었거나로드 호출이 없다는 것을 의미합니까? 로드 호출이 허용되면 다음이 유용 할 수 있습니다. 진행 상황은 첫 번째 화재에서 들어오는 데이터의 총 크기를 제공합니다. 우리는 단지 주어진 진행 상황이 발사되고, 현재 로딩 품목의 총 값을 취하고,이를 우리 자신의 _total 변수에 추가합니다. 우리는 Dataprovider (배열, 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 No No)로 어떻게이를 수행 할 것인지는 모르겠지만 첫 번째 추측은 PHP 스크립트 (또는 선택한 다른 스크립팅 언어)를 사용하여 파일 크기를 얻고 값을 반환하는 것입니다.
또 다른 (아마도 과잉) 방법은 파일의 헤더 (파일 크기 포함)를 서버에게 묻는 것을 만드는 것입니다. 파일을 다운로드하기 시작하고 파일 크기가있을 때 (매우 빠르야 함) 또는 (이전에 제안 된대로) 파일 크기를 요구하는 다른 방법 (유용한 경우 유용한 경우)을 닫을 때 단순히 파일을 다운로드하고 스트림을 닫는 것도 마찬가지로 달성 할 수 있습니다. 여러 파일을로드하고로드하기 전에 파일 크기를 알아야합니다)
Brian Hodge가 제공 한 방법과 특정 폴더 내의 모든 파일의 결합 크기를 가져 와서 데이터를 플래시.
Paradise Paradise를 사전로드하기위한 여정에서 발생한 주요 문제 중 하나는 Flash Player가 파일 크기와 관련하여 일관되지 않은 결과를 낳는 것 같습니다! 내가 정확히 같은 파일을로드하더라도 플래시가 두 번 플래시하면 크기가 다르다고 말할 것입니다.
또한 PHP (PHP) 방법에 문제가 발생했기 때문에 PHP 스크립트는 플래시로 생성 된 정확한 파일 크기 결과를 생성하기 때문에 로더는 캐싱 및 캐싱 및 128%로 85% 또는 128%로 이동했습니다. 플래시의 기분 :/
나는 멋진 수업을 선호하여 두 가지 방법을 모두 폐기했습니다. 벌크 로더, 여러 항목의 대기열로드 및 진행 상황 추적 등을 허용하는 것 : D
SWF 파일 크기를 크게 증가시킬 것입니다 ... 얼마나 아이러니 한가