2013-07-17 23 views
0

我想在iOS應用程序上實現上傳進度欄。我目前的實現不這樣簡單的一招:即使AllowWriteStreamBuffering緩存HttpWebRequest false

using (Stream requestStream = request.GetRequestStream()) { 
    byte[] dataToUpload = this.DataToUpload; 
    int dataToUploadLength = dataToUpload.Length; 
    int uploadedSoFar = 0; 

    while (uploadedSoFar < dataToUploadLength) { 
     int toUpload = 8192; 
     if (uploadedSoFar + toUpload > dataToUploadLength) { 
      toUpload = dataToUploadLength - uploadedSoFar; 
     } 

     requestStream.Write (dataToUpload, uploadedSoFar, toUpload); 
     uploadedSoFar += toUpload; 

     this.SetUploadedRatio ((float)uploadedSoFar/(float)dataToUploadLength); 
} 

的問題是requestStream.Write()是即時的,直到周圍的數據100KB發送的話,那就更符合邏輯,上面顯示的SetUploadedRatio()方法被調用喜歡它應該。當文件很大時,這並不是什麼大問題,雖然我們仍然可以看到它立即需要一定的百分比,然後開始降低百分比。在速度較慢的連接上,發送一個60KB的文件導致進度條立即顯示爲100%,但實際上傳完全沒有完成,所以我們無法真正顯示正在進行的操作。

我做了一個公開問題(上MonoTouch的iOS版)一個完整的展示,鏈接在下面提供: https://github.com/rFlex/Monotouch-Upload-Showcase

這是有趣的事情是: https://github.com/rFlex/Monotouch-Upload-Showcase/blob/master/TestUpload/Uploader.cs

+0

您是否嘗試在寫入後刷新流?這可能是你描述的行爲的原因。 – dna

+0

是的,我已經嘗試過沒有成功。 – rFlex

回答

0

只要你設置在調用GetRequestStream之前調用HttpWebRequest.ContentLength或HttpWebRequest.SendChunked,每次調用Stream時都會將發送的數據發送到服務器[開始]寫入。如果您以小塊形式撰寫文件,您可以瞭解您有多遠。

相關問題