3

HttpConnection を使用してサーバーにファイルをアップロードしたいと考えています。そこで、アップロードジョブの割合を表す GaugeField を作成したいと思います。

しかし、OutputStream で見つけることができる.flush()のは、Output Stream 全体を一度サーバーにフラッシュすることだけです。そのため、特定の時間にアップロードされたバイト数を計算できません

それを作る方法は?何か案が?

私は以下を使用しましたが、ほとんどの場合エラーが発生しています:

           while (position < length) {
                try {
                    os.write(postDataBytes, position, length100);
                    position += length100;
                    int location = position * 100 / length;
                    gaugeField.setValue(location);
                    os.flush();
                }
            }
4

2 に答える 2

2

これを行うには、次の 2 つの方法があります。

  • クライアント側:クライアントが書き込んだバイトを特定します(データが実際にサーバーに到達したかどうかがわからないため、これは正しい方法ではありません)。この場合、カスタム SocketFactory を提供し、基礎となるソケットをラップすることによって、書き込まれたバイト数をカウントする必要があります。
  • サーバー側:最善の方法は、セッションでサーバーが読み取ったデータの数を保持し、クライアントにリクエストを送信してアップロードの進行状況を知らせることです。

これを達成するための手順は次のとおりです。

1) サーバー側の Upload Servlet で、セッションの読み取りバイトを更新します。

 session.setAttribute(pBytesRead);

2) 進行状況を応答に書き込むサーブレット UploadProgressServlet を作成します。

response.getOutputStream().write(session.getAttribute("uploadprogress"));

3) クライアントが UploadProgressServlet にリクエストを送信して進行状況を把握できるようにする

Progress Listener をサポートするApache Commons Upload API を使用することもできます。この場合、データをマルチパート形式で書き込む必要があります。

于 2012-05-29T07:45:25.040 に答える
0

メソッドを使用できます

write(byte[] b, int off, int len); 

変数に従ってパーセンテージを計算しoffsetます。

于 2012-05-29T07:47:42.397 に答える