2012-12-14 19 views
5

Possiedo un'applicazione client desktop Java che carica i file su un servizio REST.Barra di avanzamento caricamento file utilizzando RestTemplate.postForLocation

Tutte le chiamate al servizio REST vengono gestite utilizzando la classe Spring RestTemplate.

Sto cercando di implementare una barra di avanzamento e annullare la funzionalità in quanto i file caricati possono essere abbastanza grandi.

Ho cercato un modo per implementarlo sul web ma non ho avuto fortuna.

Ho provato a implementare il mio ResourceHttpMessageConverter e a sostituire il metodo writeInternal(), ma questo metodo sembra essere chiamato durante un'operazione di buffering prima di postare effettivamente la richiesta (quindi il flusso viene letto tutto in una volta prima che l'invio abbia luogo)).

Ho anche provato a sovrascrivere il metodo CommonsClientHttpRequestFactory.createRequest() e ad implementare la mia propria classe RequestEntity con un metodo writeRequest() speciale ma si verifica lo stesso problema (lo stream viene letto prima di inviare effettivamente il post).

Sto cercando nel posto sbagliato? Qualcuno ha fatto qualcosa di simile.

Un sacco di cose che ho letto sul web sull'implementazione delle barre di avanzamento parla di come iniziare il caricamento e quindi di utilizzare richieste AJAX separate per eseguire il polling del server Web per un progresso che sembra un modo strano per farlo.

Qualsiasi aiuto o consiglio molto apprezzato.

+0

questo potrebbe avere quello che stai cercando per http://stackoverflow.com/questions/5294532/httpclient-upload-big-file-and-show-send-bytes-number – ams

+1

Grazie per il collegamento. Sfortunatamente l'esempio fornito utilizza le librerie di apache di basso livello, quindi non sono chiaro quale sia la classe FileBody equivalente nelle librerie Spring Rest, o come potrei iniettare la mia implementazione da utilizzare. – glidester

risposta

0

Non c'erano molti dettagli su cosa fosse questa app, o come funziona, quindi questa risposta è vaga, ma credo che si possa fare qualcosa del genere per tenere traccia dei progressi del caricamento.

Se questa è realmente un'app Client Java (ovvero non HTML/JavaScript ma un programma java) e si sta davvero caricando un file come stream, si dovrebbe essere in grado di tenere traccia dell'avanzamento del caricamento contando i byte in la matrice viene trasmessa nel buffer del flusso e la confronta con il conteggio totale dei byte dall'oggetto file.

Quando si ottiene il file ottenere le sue dimensioni.

Integer totalFile = file.getTotalSpace(); 

Dove mai si sta trasmettendo come un flusso che si sta presumibilmente aggiungendo byte a un buffer di uscita di qualche tipo

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

Siamo spiacenti ma questo non aiuta. In linea di principio questa soluzione è valida, ma come ho affermato nell'OP il flusso sembra essere completamente letto * prima * il caricamento inizia. Quindi la barra di avanzamento dovrebbe arrivare al 100% e quindi rimanere lì per il tempo necessario per il caricamento. – glidester

+0

??? Come si legge PRIMA del caricamento? Non è possibile. Come indicato, non sono stati forniti dettagli relativi a ciò che viene fatto o come. Dovresti fornire i dettagli reali per fornire una risposta più dettagliata. – BrianC

+0

Anche se stiamo parlando del client qui come viene letto lo stream? Dovrebbe essere scritto dal cliente. – BrianC

Problemi correlati