2012-12-14 30 views
5

Tôi có ứng dụng máy khách Java để tải tệp lên dịch vụ REST.Thanh tiến trình tải lên tệp bằng cách sử dụng RestTemplate.postForLocation

Tất cả các cuộc gọi tới dịch vụ REST được xử lý bằng lớp Spring RestTemplate.

Tôi đang tìm cách triển khai thanh tiến trình và hủy chức năng vì các tệp đang được tải lên có thể khá lớn.

Tôi đã tìm cách thực hiện điều này trên web nhưng không có may mắn.

Tôi đã thử triển khai ResourceHttpMessageConverter của riêng mình và thay thế phương thức writeInternal() nhưng phương pháp này dường như được gọi trong một số hoạt động đệm trước khi gửi yêu cầu (vì vậy luồng được đọc tất cả trong một lần trước khi gửi đi diễn ra).

Tôi thậm chí đã cố gắng ghi đè phương thức CommonsClientHttpRequestFactory.createRequest() và triển khai lớp RequestEntity của riêng tôi với phương thức writeRequest() đặc biệt nhưng cùng một vấn đề xảy ra (luồng được đọc trước khi gửi bài).

Tôi đang tìm kiếm địa điểm sai? Có ai đã làm một cái gì đó tương tự.

Rất nhiều thứ tôi đã đọc trên web về việc triển khai thanh tiến trình nói về việc bắt đầu tải lên và sau đó sử dụng các yêu cầu AJAX riêng để thăm dò ý kiến ​​của máy chủ web.

Bất kỳ trợ giúp hoặc mẹo nào được đánh giá cao.

+0

điều này có thể có những gì bạn đang tìm kiếm http://stackoverflow.com/questions/5294532/httpclient-upload-big-file-and-show-sent-bytes-number – ams

+1

Cảm ơn bạn đã liên kết. Thật không may, ví dụ được đưa ra sử dụng các thư viện apache mức thấp vì vậy tôi không rõ ràng lớp tương đương của FileBody sẽ nằm trong thư viện Spring Rest, hoặc làm thế nào tôi có thể tiêm thực hiện của riêng tôi để chúng sử dụng. – glidester

Trả lời

0

Không có nhiều chi tiết về ứng dụng này là gì hoặc hoạt động như thế nào để phản hồi này mơ hồ nhưng tôi tin rằng bạn có thể thực hiện một việc như thế này để theo dõi quá trình tải lên của mình. Nếu đây thực sự là một ứng dụng Java Client (tức là không phải HTML/JavaScript nhưng một chương trình java) và bạn thực sự có nó tải lên một tập tin như một dòng thì bạn sẽ có thể theo dõi tiến trình tải lên của bạn bằng cách đếm các byte trong mảng được truyền trong bộ đệm luồng và so sánh với tổng số byte từ đối tượng tệp.

Khi bạn nhận được tệp có kích thước.

Integer totalFile = file.getTotalSpace(); 

đâu bao giờ bạn đang truyền tải như một luồng mà bạn đang có lẽ thêm byte để một bộ đệm đầu ra của một số loại

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

Xin lỗi nhưng điều này không hữu ích. Về nguyên tắc giải pháp này là âm thanh, nhưng như tôi đã nêu trong OP dòng có vẻ là hoàn toàn đọc * trước khi * tải lên bắt đầu. Vì vậy, thanh tiến trình sẽ whiz đến 100% và sau đó ngồi đó cho tuy nhiên dài tải lên mất. – glidester

+0

??? Nó được đọc như thế nào TRƯỚC KHI tải lên? Chuyện đó không thể xảy ra được. Như đã nêu không có chi tiết đã được đưa ra có những gì đang được thực hiện hoặc làm thế nào. Bạn sẽ phải cung cấp cho các chi tiết thực tế cung cấp một câu trả lời chi tiết hơn. – BrianC

+0

Ngoài ra, nếu chúng ta đang nói về khách hàng ở đây thì luồng được đọc như thế nào? Nó phải được viết từ khách hàng. – BrianC

Các vấn đề liên quan