2012-02-16 5 views
1

私はここからDownload a file with Adobe AIRの例を使って、サーバーからファイルをダウンロードするアプリケーションを作った。Adob​​e Air。 URLStreamやFileStreamの奇妙なバグ

エラーを説明します。

1)Adobe AIRのアプリは、サーバhttp://example.com/data/init.xml

2からxmlファイルをダウンロードした)私は、すべての[OK]を開きました。

3)Adobe Air Appは、サーバーから同じファイルを再度ダウンロードしました。今、メモ帳で開くと、init.xmlはバイナリファイルであると言います。私がディスクからinit.xmlを削除して、やり直してください。 init.xmlはバイナリファイルです。航空アプリの再開は機能しません。

4)サーバーのinit.xmlをinit123.xmlに変更してもう一度ダウンロードしました。 init123.xmlが通常のxmlファイルとして開かれました。もう一度ダウンロードすれば、ステップ3 - init123.xmlはバイナリファイルです。

ここでエラーが発生する可能性がありますか?

ありがとうございます。

OS - Windows 7の

も変更されたファイルのMD5。

これは、URLの最後に乱数を追加することで解決できます。私はそれをもう一度ロードする場合

urlStream.load(new URLRequest(remoteFile+'?'+Math.random())); 

が、この

urlStream.load(new URLRequest(remoteFile)); 

は、ファイルのバイナリを作ります。

ソース

​​
+0

URLLoaderの代わりにURLStreamを使用する理由は何ですか?私はストリーム関連のクラスについてはわかりませんが、URLLoaderではデータフォーマットを指定できます。 – Exort

+0

コードを入力できますか?ファイルを保存するために使用するコードも便利です。 – sch

+0

あなたは**「エラー2」**を見ていると報告していないので、何もないと思います。 ** currentPosition **と** urlStream.bytesAvailable **をトレースできますか? – sch

答えて

1

先のファイルを空にしてください。前のバイトはおそらくinit.xmlに保存されています。

+0

init.xmlを完全に削除しても、バイナリデータとして再度ダウンロードされます。 –

0

ByteArrayを間違った位置に読み書きしています。あなたは持っている:

thisStarturlStreamで利用可能な現在のバイト数である
// In "progress" function 
urlStream.readBytes(bytes, thisStart); 
fileStream.writeBytes(bytes, thisStart); 

URLStream.readBytes()positionは、bytesに読み込みを開始する位置を示します。同様に、FileStream.writeBytes()positionパラメータは、読み取りを開始する位置をbytesから参照します。 progress()が呼び出されるたびにbytesが再インスタンス化されるので、常に0の位置から読み書きを開始する必要があります。

+0

申し訳ありませんが、この回答は-1です。 thisStartは最後の反復からのオフセットです。彼は同じバイトを何度も何度も読み返したくない。彼は最後にやめたところから迎えに行きたいと思っています。バイト配列からバイトを読み込んでも、バイト配列からそれらを削除しません。 –

+0

@The_asMan [ドキュメントを読む](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/URLStream.html# readBytes%28%29): "データ読み込みを開始するオフセット_into_バイト。デフォルトは0"です。 – NoobsArePeople2

+0

最初の繰り返しでは、ゼロはゼロから始まります。 2回目の反復で、最初の反復が途切れたところから読み始めます。そして、第二の反復は中止された第三の反復。データがストリーミングされると、データを置き換えずにbyteArrayに追加されます。 –

0

ファイルから瞬時に読み込まれるイメージがキャッシュされていることがわかります。
完全な関数では、空のファイルになるfileStream.writeBytesを実行していないので、あなたのコードはそれを処理しません。
これはテストされたコードではありませんが、このようなことを行う必要があります。

protected function progress(event:ProgressEvent):void 
{ 
    var bytes :ByteArray = new ByteArray(); 
    var thisStart :uint = currentPosition; 
    currentPosition += urlStream.bytesAvailable; 
    urlStream.readBytes(bytes, thisStart); 
    if(bytes.length > 0){ 
    fileStream.writeBytes(bytes, thisStart); 
    } 
}  
protected function complete(event:Event):void 
{ 
    progress(event);// call progress to verify data is written 
    urlStream.close(); 
    fileStream.close(); 
    downloadCompleteFlag = true; 
} 
関連する問題