下載大檔案
RestTemplate
的 getForObject
和 getForEntity
方法將整個響應載入到記憶體中。這不適合下載大檔案,因為它可能導致記憶體不足異常。此示例顯示如何流式傳輸 GET 請求的響應。
RestTemplate restTemplate // = ...;
// Optional Accept header
RequestCallback requestCallback = request -> request.getHeaders()
.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));
// Streams the response instead of loading it all in memory
ResponseExtractor<Void> responseExtractor = response -> {
// Here I write the response to a file but do what you like
Path path = Paths.get("some/path");
Files.copy(response.getBody(), path);
return null;
};
restTemplate.execute(URI.create("www.something.com"), HttpMethod.GET, requestCallback, responseExtractor);
請注意,你不能簡單地從提取器返回 InputStream
,因為在 execute 方法返回時,底層連線和流已經關閉。