我沒有找到辦法做到這一點,流始終關閉。作爲一種變通方法,我創建了下面的代碼:
public interface ResourceReader {
void read(InputStream content);
}
與下面的實現:
public class StreamResourceReader implements ResourceReader {
private HttpServletResponse response;
public StreamResourceReader(HttpServletResponse response) {
this.response = response;
}
@Override
public void read(InputStream content) {
try {
IOUtils.copy(content, response.getOutputStream());
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}
然後控制器:
@RequestMapping(value = "document/{objectId}")
public void getDocumentContent(@PathVariable String objectId, HttpServletResponse response) {
ResourceReader reader = new StreamResourceReader(response);
service.readDocumentContent(objectId, reader);
}
調用其他模板:
restTemplate.execute(uri, HttpMethod.GET, null,
new StreamResponseExtractor(reader));
和字符串r esponse萃取器:
@Override
public ResponseEntity extractData(ClientHttpResponse response) throws IOException {
reader.read(response.getBody());
return null;
}
它的作品就像一個魅力! :)
所以這不會加載整個文件到內存? –
是的,它不需要在內存中有整個文件。它會在處理它時加載整個文件,但不需要太多的內存 – zibi
我遵循同樣的事情。但我看到inputStream被截斷。 https://stackoverflow.com/questions/46332692/response-body-from-resttemplate-is-getting-truncated-when-downloading-a-file –