如何使用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 whateverfinal 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