春季:下载大文件引发OutOfMemoryError

时间:2019-12-19 08:22:33

标签: spring spring-boot

当前,我正在使用以下代码来下载文件:

ResponseEntity<Resource> response = this.restTemplate
    .getForEntity(
        uriToCall,
        Resource.class
    );

问题在于,当我尝试下载大文件时,代码会引发OutOfMemoryError

是否还有其他方法可以使我的大文件避免此错误?

编辑: 另一个问题。

我正在考虑应用FileSystemResource而不是Resource

ResponseEntity<FileSystemResource> resp = this.restTemplate
    .getForEntity(
        uriToCall,
        FileSystemResource.class
    );

FileSystemResourceResource之间有什么区别?那堂课要实现我的目标吗?

2 个答案:

答案 0 :(得分:1)

对于大文件,更好的方法是使用流,因此大小仅受可用磁盘空间限制。 这样的事情应该起作用:

this.restTemplate.execute(uriToCall, HttpMethod.GET, null, clientHttpResponse -> {
    File file= File.createTempFile("download", "tmp");
    StreamUtils.copy(clientHttpResponse.getBody(), new FileOutputStream(file));
});

另请参阅此example,以获取暂停和继续播放的信息。

答案 1 :(得分:0)

有关类似问题的答案,请参见以下内容:

How to forward large files with RestTemplate?

按如下所示创建RestTemplate:

RestTemplate restTemplate = new RestTemplate();

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

这应该可以解决您的内存不足问题。