2012-05-29 38 views
3

我想使用HttpConnection將文件上傳到服務器。所以我想製作一個代表上傳作業百分比的GaugeField。使用Http連接上傳文件並計算上傳字節的百分比

但是我在OutputStream中找到的所有內容都是.flush(),它將整個輸出流刷新到服務器。所以我無法計算在特定時間上傳的字節數

如何做到這一點?任何想法?

我用下面的,但它給錯誤的大部分時間:

  while (position < length) { 
       try { 
        os.write(postDataBytes, position, length100); 
        position += length100; 
        int location = position * 100/length; 
        gaugeField.setValue(location); 
        os.flush(); 
       } 
      } 
+0

每次發送1M(或其他合適的增量),並在每次發送後更新百分比。 –

+0

@DavidWallace如何做到這一點?我更新了關於如何使用它的問題,但這在大多數情況下都會失敗......所以我以錯誤的方式使用它 –

+1

基本思路看起來大致正確。當你說「大多數時候失敗」是什麼意思?究竟發生了什麼?什麼是你的代碼中的length100--從哪裏來的? –

回答

2

有兩種方法做到這一點:

  • 客戶端:識別字節,客戶端已經寫入(這是不正確的,因爲您不知道數據是否真的到達了服務器)。在這種情況下,您應該通過爲您提供自定義SocketFactory並封裝底層套接字來計算寫入的字節。
  • 服務器端:最好的方法是保持服務器在會話中讀取數據的計數,並讓客戶端發出請求以瞭解上傳進度。

下面是實現這一目標的步驟:

1)在上傳的Servlet在服務器端更新會話讀取的字節。

session.setAttribute(pBytesRead); 

2)寫入一個servlet UploadProgressServlet其寫入進展到響應。

response.getOutputStream().write(session.getAttribute("uploadprogress")); 

3)讓客戶端發出請求到UploadProgressServlet知道進度

你也可以使用Apache Commons Upload API其中有進展監聽器的支持。在這種情況下,您必須以多部分格式寫入數據。

+0

您是否有一個關於如何在真正的Blackberry代碼中工作的示例? –

+0

從哪裏獲得圖書館?在JDE –

+0

中沒有識別出這樣的代碼我已經更新了答案,可以看看它。詢問我是否有任何問題。 –

0

你可以使用方法

write(byte[] b, int off, int len); 

,並根據offset變量計算百分比。

+0

此方法寫入輸出流,但不刷新。我試過了,但是直到所有的字節被寫入後,響應纔會進入服務器。 –