3

毎晩 WordPress サーバーに接続し、すべてのコンテンツへのパスを含む JSON ファイルを取得し、そのコンテンツをダウンロードしてキオスクのハード ドライブに保存する AIR キオスク アプリを作成しています。

数百のファイル (jpg、png、f4v、xml) があり、それらのほとんどは問題なくダウンロード/保存されます。ただし、完全にはダウンロードされない f4v ファイルが 2 つあります。complete イベントはディスパッチされますが、bytesTotal (progress イベントから) と bytesAvailable (complete イベントから) を比較すると、一致しません。bytesTotal が大きくなります。bytesTotal (progress イベントから) は、サーバー上のバイトと一致します。

進行状況イベントの bytesLoaded は、bytesTotal と一致するポイントまで増加しないため、進行状況イベントにも依存できません。これは、毎回同じ 2 つのビデオで発生するようです。ビデオはそれほど大きくなく、1 つが 13MB で、もう 1 つが 46MB です。問題なくダウンロードできる大きなビデオがあります。

編集: コンピューターを再起動した後、2 つのビデオのダウンロードは完了しましたが、300kb の png ファイルで同じ問題が発生しています。

URL を Firefox に貼り付けると、正しくダウンロードされます。ファイルをダウンロードするための簡単な C# アプリも作成しましたが、問題なくダウンロードできるため、Flash/AIR に問題があるようです。

編集: これはコードのより単純なバージョンです。これはテスト プロジェクトからのもので、これが唯一のコードです (URL はローカル ネットワーク上にあるため、自分でファイルをダウンロードすることはできません)。

package  {

    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.net.URLStream;

    [SWF(backgroundColor="#000000", frameRate="24", width="640", height="480")]

    public class Test extends Sprite {

        private var fileSize:Number;
        private var stream : URLStream;
        private var url:String = "http://192.168.150.219/wordpress2/wp-content/uploads/2012/12/John-Butler-clip1.f4v";

        public function Test() {
            if (stage)
                init();
            else
                this.addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event=null):void {
            this.removeEventListener(Event.ADDED_TO_STAGE, init);
            stream = new URLStream();
            stream.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
            stream.addEventListener(Event.COMPLETE, onLoadComplete);
            stream.load(new URLRequest(url));
        }

        private function onLoadProgress(event:ProgressEvent):void {
            fileSize = event.bytesTotal;
            var percent:Number = event.bytesLoaded / event.bytesTotal * 100;
            trace(percent + "%"); // this never gets to 100%
        }

        private function onLoadComplete(event:Event):void {
            trace("loaded", stream.bytesAvailable, "of", fileSize); 
            // outputs "loaded 13182905 of 13184365"
            // so why is it "complete" when it isn't fully downloaded?
        }
    }
}
4

3 に答える 3

2

と比較せず、代わりbytesAvailableに使用してください。lengthBytesAvailableは実際にはByteArray.length - ByteArray.positionです。したがって、ByteArray内の位置がインデックス0から離れると、bytesAvailable値は減少します。長さは常に配列内の合計バイト数になります。

長さを使用して比較してみて、これが違いを生むかどうかを確認してください。コードをふるいにかけて、いつでも位置を変更しているかどうかを確認する時間がありません(意図的または偶発的です。複数の方法で変更できます)。そのため、現時点で提供できる最善の方法です。

于 2013-01-24T16:02:31.647 に答える
2

他の誰かが私と同じ問題を抱えている場合。AIR にも存在するキャッシュの問題であることが判明したため、リクエストに追加されたタイムスタンプがこれを解決します: http://www.newtonflash.com/blog/as3/prevent-xml-caching-problem/#comment- 43

{
var xmlPath:String="replaceYourXMLPathHere.xml"
var urlReq:URLRequest = new URLRequest(xmlPath+"?time=" + new Date().getTime());
}
于 2013-03-19T15:50:14.720 に答える
0

あなたの答えはあなたの質問にあります。

通常の URL (ファイル) - このサーバーにとって、これはデータのブロックです。サーバーが「データのブロック」を配信すると、配信プロセスは「完了」と見なされます。この場合、ファイルが 100kb の場合、100kb が受信されると、Flash はこれを「COMPLETE」と見なします。

URLStream - サーバーにとって、これは [ TWO ] ブロックのデータです (非常に単純な見方です)。サーバーは最初にCONNECTIONをストリームに提供し、次にSTREAM DATAを提供します。これは、説明どおりに Flash で処理されます。

Flash はCONNECTIONのロードを「COMPLETE」と見なし、 STREAMデータがロードされているかどうかを決してチェックしません。それはサーバー次第です。どのストリームでも、実際に [load progress] イベントをチェックし、入ってくるデータの各バイトを読み取り、必要に応じて構築する必要があります。

于 2013-01-24T21:00:13.043 に答える