7

ファイルを REST サービスにアップロードする Java デスクトップ クライアント アプリケーションがあります。

REST サービスへのすべての呼び出しは、Spring RestTemplate クラスを使用して処理されます。

アップロードされるファイルが非常に大きくなる可能性があるため、プログレスバーを実装して機能をキャンセルすることを検討しています。

これを Web に実装する方法を探していましたが、うまくいきませんでした。

私は独自の ResourceHttpMessageConverter を実装し、 writeInternal() メソッドを置き換えようとしましたが、このメソッドは、実際にリクエストを投稿する前に、何らかのバッファリングされた操作中に呼び出されたようです (したがって、送信が行われる前にストリームが一度に読み取られます)。

CommonsClientHttpRequestFactory.createRequest() メソッドをオーバーライドし、特別な writeRequest() メソッドを使用して独自の RequestEntity クラスを実装しようとしましたが、同じ問題が発生します (ストリームは実際に投稿を送信する前にすべて読み取られます)。

私は間違った場所を探していますか?誰かが似たようなことをしましたか。

プログレスバーの実装について私がウェブで読んだ多くのことは、アップロードを見つめてから、別のAJAXリクエストを使用してウェブサーバーに進行状況をポーリングすることについて話していますが、これは奇妙な方法のようです。

ヘルプやヒントは大歓迎です。

4

2 に答える 2

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();
        }
    }
于 2015-10-21T20:17:31.757 に答える