2012-12-14 265 views
5

我有一個Java桌面客戶端應用程序,將文件上傳到REST服務。使用RestTemplate.postForLocation文件上傳進度條

使用Spring RestTemplate類處理對REST服務的所有調用。

我期待實現進度條並取消功能,因爲上傳的文件可能相當大。

我一直在尋找一種方法來實現這個在網絡上,但沒有運氣。

我試着實現我自己的ResourceHttpMessageConverter並替換writeInternal()方法,但是在實際發佈請求之前似乎在某種緩衝操作期間調用了此方法(所以流在發送之前一次全部讀取)。我甚至嘗試覆蓋CommonsClientHttpRequestFactory.createRequest()方法並使用特殊的writeRequest()方法實現我自己的RequestEntity類,但同樣的問題發生(流在實際發送帖子之前全部被讀取)。

我看錯了地方?有沒有人做過類似的事情?

很多我在網上讀到的關於實現進度條的東西都是關於盯着上傳,然後使用單獨的AJAX請求來輪詢Web服務器的進度,這似乎是一種奇怪的方式。

任何幫助或建議非常感謝。

+0

這可能有你在找什麼http://stackoverflow.com/questions/5294532/httpclient-upload-big-file-and-show-sent-bytes-number – ams

+1

感謝您的鏈接。不幸的是,所給出的例子使用了低級別的apache庫,所以我不清楚Spring Rest庫中等效的FileBody類是什麼,或者我可以如何注入自己的實現以供它們使用。 – glidester

回答

0

關於這個應用程序是什麼,或者它是如何工作的,所以這個迴應是模糊的,但我相信你可以做這樣的事情來跟蹤你的上傳進度。

如果這真的是一個Java客戶端應用程序(即不是HTML/JavaScript,但是一個Java程序),你真的有它上傳一個文件作爲一個流,那麼你應該能夠跟蹤你的上傳進度,該數組在數據流緩衝區中傳輸並將其與文件對象的總字節數進行比較。

當你得到文件的大小。

Integer totalFile = file.getTotalSpace(); 

你在哪裏都被傳送,你大概是添加字節某種形式的輸出緩衝區的流

byte[] bytesFromSomeFileReader = [whatEverYouAreUsingToReadTheFile]; 

    ByteArrayOutputStream byteStreamToServer = new ByteArrayOutputStream(); 
    Integer bytesTransmitted = 0; 

    for (byte fileByte : bytesFromSomeFileReader) { 
     byteStreamToServer.write(fileByte); 
      // 
      // Update your progress bar every killo-byte sent. 
      // 
     bytesTransmitted++; 
     if((bytesTransmitted % 1000) = 0) { 
      someMethodToUpdateProgressBar(); 
     } 
    } 
+0

對不起,但這並沒有幫助。原則上這個解決方案是合理的,但正如我在OP中所說的那樣,流在上傳開始之前似乎已被完全讀取。所以進度條會100%高速,然後在上傳過程中長時間坐在那裏。 – glidester

+0

???上傳之前如何閱讀?這是不可能的。如上所述,沒有提供詳細的信息來說明正在做什麼或如何做。你將不得不提供實際的細節提供更詳細的答案。 – BrianC

+0

另外,如果我們在這裏談論客戶,流如何閱讀?它應該從客戶端寫入。 – BrianC