私はジャージクライアントがあり、プログレスバーを必要とするほど大きなファイルをアップロードする必要があります。
問題は、アップロードが数分かかるため、アプリケーションが起動したらすぐに100%に移動することがわかります。その後、 "完了した"文字列を印刷するのに数分かかります。
バッファーに送られたかのようで、実際のアップロード速度であるの代わりにバッファー転送速度を読み取っていました。これはプログレスバーを役に立たなくします。ジャージクライアントのアップロードの進捗状況
これは非常に単純なコードです:私がいるContainerListenerフィルタを追加した、obviouslt builder.post呼び出す前に
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource("www.myrestserver.com/uploads");
WebResource.Builder builder = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE);
FormDataMultiPart multiPart = new FormDataMultiPart();
FileDataBodyPart fdbp = new FileDataBodyPart("data.zip", new File("data.zip"));
BodyPart bp = multiPart.bodyPart(fdbp);
String response = builder.post(String.class, multiPart);
進行状態を取得するには:
final ContainerListener containerListener = new ContainerListener() {
@Override
public void onSent(long delta, long bytes) {
System.out.println(delta + " : " + long);
}
@Override
public void onFinish() {
super.onFinish();
System.out.println("on finish");
}
};
OnStartConnectionListener connectionListenerFactory = new OnStartConnectionListener() {
@Override
public ContainerListener onStart(ClientRequest cr) {
return containerListener;
}
};
resource.addFilter(new ConnectionListenerFilter(connectionListenerFactory));
トマシュに感謝、この答えはとても良いです。クライアントを設定する2つの方法を提供してくれたという事実は、本当に立派で説明的です。不幸にも、問題は解決しません。私はentityStream.writeの後にSystem.out.println(...)を置くだけですが、その結果、大きなファイル(> 10MB)を数分の1秒で書き込んだ後、「本当の」アップロードが行われている間にフリーズします。この解決策でも起こる事実は、問題が他の場所にあることを意味します。あなたの答えは、私はそれを受け入れることができませんが、私は正しいとマークすることがうれしいでしょう別の特定の質問を開始することができます。 :-) – AgostinoX
私はentityStream.flush()も追加しようと試みました。 entityStream.write(...)の後にバッファに書き込むのではなく、実際の書き込みを強制的にソケットに強制します。同じ結果:-( – AgostinoX
ok、素晴らしい答え、それは両方の方法で、リスナーとカスタムファイルプロバイダで動作します。おそらく、ソリューションが2番目の部分であることを強調する必要があります。プロバイダーはリスナーの代わりとして興味深いですし、ジャージーアーキテクチャーを明確にするのに役立ちますので、私はそれを保つでしょうが、質問への直接的な答えとしてではありません。 – AgostinoX