2016-06-21 11 views
4

私は大きなファイルをダウンロードして、別のサーバーのRestControllerを介してストリームする必要があるRestControllerによって提供されます。エンドサーバを直接呼び出すと、結果ストリームは正常に処理されます。ただし、RestTemplateを使用してこのサーバーを呼び出してからOutputStreamにレスポンスを書き込むと、レスポンスはファイル全体が準備ができてからストリーミングされるまでフロントサーバーでバッファリングされます。 OutputStreamにファイルを書き込む方法はありますか?RestTemplateを使用したスト​​リームファイルのダウンロード

現時点では、フロントサーバー上の私のコードは、私がバッファリングしないように、私のRestTemplateを設定していると私はこれが使用されている要求の種類を確認することで動作していることを確認した。この

@ResponseBody 
public void downloadResults(HttpServletRequest request, HttpServletResponse response, @RequestParam("id") String jobId, OutputStream stream) 
     throws IOException 
{ 
    byte[] data = restTemplate.exchange("http://localhost/getFile", HttpMethod.POST, requestEntity, byte[].class, parameters).getBody(); 
    stream.write(data); 
} 

に似ています、(SimpleStreamingClientHttpRequest)。すべてはそのわずかだけではなく、それは

+0

エンティティを構築するためのレスポンスを読み込むので、 'RestTemplate'を使うのは正しいアプローチではないのですか?' HttpClient'のような他のアプローチを試してください。 – shachar

+0

私はZuulを通してリクエストを代理しているので、RestTemplateする必要があります。 'ClientHttpRequestInterceptor'を使う必要があります - 私はまだ' HttpClient'でインターセプタを使うことができますか? – ali2992

+0

私は 'RestTemplate'を使う代わりに' HttpUrlConnection'を使って基本的なhttpリクエストを行いました。 'EurekaClient'を使って正しいプロキシされたルートを取得しました。オンラインで見ると、@shacharは正しいと思われ、RestTemplateは 'HttpEntity'でレスポンスをラップしようとしているときにいつもバッファリング効果を持ち、すべてのデータが準備完了するのを待たなければなりません – ali2992

答えて

0

RestTemplateに来るようよりも、一度にすべてのストリームに書き込まれたがpointed out in this JIRA issueとして、レスポンスボディをストリーミングするためのものではありません、正しい戻ってくる データ。

関連する問題