2012-02-16 12 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應用程序再次從服務器下載相同的文件。現在,如果我用記事本打開它,它說init.xml是二進制文件。如果我從磁盤中刪除init.xml並重試 - 相同。 init.xml是一個二進制文件。重新打開空氣應用程序不起作用。

4)我將服務器上的init.xml更改爲init123.xml並再次下載。 init123.xml作爲普通的xml文件打開。如果我再次下載它,那麼步驟3 - init123.xml是一個二進制文件。

哪裏可能是錯誤?

謝謝。

操作系統 - Windows 7

文件的MD5也發生了變化。

這可以解決它我將隨機數添加到URL的結尾。

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

但這

urlStream.load(new URLRequest(remoteFile)); 

使得文件的二進制如果我加載它第二次。

來源

​​
+0

你爲什麼使用URLStream而不是URLLoader的任何原因?我不知道流相關類,但URLLoader讓你指定數據格式。 – Exort 2012-02-16 13:37:37

+0

你能提供一些代碼嗎?您用於保存文件的代碼也可能很有用。 – sch 2012-02-16 13:47:18

+0

你不報告看到任何**'錯誤2'**,所以我想沒有任何。你可以跟蹤** currentPosition **和** urlStream.bytesAvailable **嗎? – sch 2012-02-16 14:09:55

回答

1

嘗試清空目標文件。您可能保留了以前的字節init.xml

+0

即使我完全刪除了init.xml,它也會以二進制數據的形式再次下載。 – 2012-02-16 14:38:54

0

您正在讀取和寫入您的ByteArray錯誤的位置。您有:

// In "progress" function 
urlStream.readBytes(bytes, thisStart); 
fileStream.writeBytes(bytes, thisStart); 

其中thisStarturlStream當前可用的字節數。

使用URLStream.readBytes()position是指您想要開始讀取的位置bytes。同樣,FileStream.writeBytes()中的position參數是指您想要從bytes開始讀取的位置。由於bytes在每次調用progress()時都會重新生效,因此您應始終從0的位置開始讀寫。

+0

對不起,我必須得到-1這個答案。 thisStart是他上次迭代的偏移量。他不想一遍又一遍地重新讀取相同的字節。他想從他最後一次離開的地方起身。從字節數組中讀取字節不會將它們從字節數組中刪除 – 2012-02-16 18:35:30

+0

@The_asMan [閱讀文檔](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/URLStream.html# readBytes%28%29):「應該開始讀取數據的偏移_into_字節,默認爲0」。 – NoobsArePeople2 2012-02-16 18:51:47

+0

是從第一次迭代的零開始。第二次迭代,他想從第一次迭代停止的地方開始閱讀。第三次迭代,第二次離開。當數據流入時,它被添加到byteArray而不是替換數據。 – 2012-02-16 18:58:49

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; 
}