2012-12-14 6 views
5

파일을 REST 서비스에 업로드하는 Java 데스크톱 클라이언트 응용 프로그램이 있습니다.RestTemplate.postForLocation을 사용하는 파일 업로드 진행률 표시 줄

REST 서비스에 대한 모든 호출은 Spring RestTemplate 클래스를 사용하여 처리됩니다.

업로드중인 파일이 상당히 클 수 있으므로 진행률 표시 줄을 구현하고 기능을 취소하려고합니다.

나는 이것을 웹에서 구현할 방법을 찾고 있었지만 운이 없었습니다.

내 자신의 ResourceHttpMessageConverter를 구현하고 writeInternal() 메서드를 대체하려고 시도했지만이 메서드는 실제로 요청을 게시하기 전에 버퍼링 된 작업 중에 호출되는 것처럼 보입니다. (그래서 스트림은 보내기 전에 하나씩 읽습니다.).

나는 CommonsClientHttpRequestFactory.createRequest() 메소드를 오버라이드하고 특별한 writeRequest() 메소드로 내 자신의 RequestEntity 클래스를 구현하기까지했다. 그러나 같은 문제가 발생한다. (스트림이 실제로 포스트를 보내기 전에 모두 읽힌다.)

내가 틀린 장소를 찾고 있습니까? 비슷한 일을 한 사람이 있습니까?

진행률 막대를 구현하는 방법에 대해 웹에서 읽은 많은 내용은 업로드를 쳐다 보면서 별개의 AJAX 요청을 사용하여 웹 서버를 폴링하여 진행하는 이상한 방법으로 보입니다.

도움이나 의견을 보내 주시면 감사하겠습니다.

+0

당신은 아마도 어떤 종류의 출력 버퍼에 바이트를 추가 스트림으로 전송되어 지금까지

Integer totalFile = file.getTotalSpace(); 

/5294532/httpclient-upload-big-file-and-show-sent-bytes-number – ams

+1

링크를 제공해 주셔서 감사합니다. 불행히도이 예제는 저수준의 아파치 라이브러리를 사용하므로 SpringBree 라이브러리에 상응하는 FileBody 클래스가 무엇인지, 또는 어떻게 사용하기 위해 내 구현을 삽입 할 수 있는지 명확하지 않습니다. – glidester

답변

0

이 앱이 무엇인지 또는 어떻게 작동하는지에 대한 세부 정보는 많지 않으므로이 응답이 모호하지만 업로드 진행 상황을 추적하기 위해 이와 같은 작업을 할 수 있다고 생각합니다.

이것이 실제로 자바 클라이언트 응용 프로그램 (즉, HTML/자바 스크립트가 아니라 자바 프로그램)이고 파일로 스트림을 업로드하는 경우 업로드 진행률을 추적 할 수 있어야합니다. 배열은 스트림 버퍼에서 전송되고 파일 객체의 총 바이트 수와 비교합니다.

파일을 가져 오면 크기가 조정됩니다. 이것이 당신이 http://stackoverflow.com/questions 무엇을 찾고있을 수 있습니다

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

관련 문제