如何使用RestTemplate转发大文件?

我有一个网络服务电话,可以通过该电话上传zip文件。然后将文件转发到另一个服务以进行存储,解压缩等。目前,文件已存储在文件系统中,然后构建了FileSystemResource。

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

我可以使用ByteStreamResource来节省时间(转发之前不需要在磁盘上保存文件),但是为此,我需要构建一个字节数组。如果文件很大,我将收到“

OutOfMemory:java堆空间”错误。

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

使用RestTemplate转发文件而不会出现OutOfMemory错误的任何解决方案?

回答:

您可以使用execute这种低级操作。在此代码段中,我使用了Commons

IO的copy方法来复制输入流。您需要HttpMessageConverterExtractor针对期望的响应类型自定义。

final InputStream fis = new FileInputStream(new File("c:\\autoexec.bat")); // or whatever

final RequestCallback requestCallback = new RequestCallback() {

@Override

public void doWithRequest(final ClientHttpRequest request) throws IOException {

request.getHeaders().add("Content-type", "application/octet-stream");

IOUtils.copy(fis, request.getBody());

}

};

final RestTemplate restTemplate = new RestTemplate();

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();

requestFactory.setBufferRequestBody(false);

restTemplate.setRequestFactory(requestFactory);

final HttpMessageConverterExtractor<String> responseExtractor =

new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());

restTemplate.execute("http://localhost:4000", HttpMethod.POST, requestCallback, responseExtractor);

(感谢巴兹(Baz)指出您需要致电setBufferRequestBody(false),否则将导致败笔)

以上是 如何使用RestTemplate转发大文件? 的全部内容, 来源链接: utcz.com/qa/413211.html

回到顶部