41

zip ファイルをアップロードできる Web サービス呼び出しがあります。その後、ファイルは別のサービスに転送され、保存や解凍などが行われます。今のところ、ファイルはファイル システムに保存され、FileSystemResource が構築されます。

Resource zipFile = new FileSystemResource(tempFile.getAbsolutePath());

時間を節約するために ByteStreamResource を使用できますが (転送前にディスクにファイルを保存する必要はありません)、そのためにはバイト配列を構築する必要があります。大きなファイルの場合、「OutOfMemory : Java heap space」エラーが発生します。

ByteArrayResource r = new ByteArrayResource(inputStream.getBytes());

RestTemplate を使用して OutOfMemory エラーを発生させずにファイルを転送する解決策はありますか?

4

3 に答える 3

25

本当に必要な@artbristolの回答の唯一の部分はこれです(RestTemplateSpring Beanとして設定できます):

final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);     
restTemplate.setRequestFactory(requestFactory);     

その後、FileSystemResourceリクエストボディとして a を使用するだけで正しいことが行われると思います。

InputStreamResourceまた、データを既に として持っていて、InputStreamそれを複数回使用する必要がない場合に、この方法で をうまく使用しました。

私の場合、ファイルを gzip し、 を でラップしGZipInputStreamましたInputStreamResource

于 2015-09-21T14:16:06.603 に答える