Return file from Spring @Controller having OutputStream

Get the OutputStream from the HttpServletResponse and write the file to it (in this example using IOUtils from Apache Commons)

@RequestMapping(value = "/download", method = RequestMethod.GET)
public void download(HttpServletResponse response) {
    ...
    InputStream inputStream = new FileInputStream(new File(PATH_TO_FILE)); //load the file
    IOUtils.copy(inputStream, response.getOutputStream());
    response.flushBuffer();
    ...
}

Make sure you use a try/catch to close the streams in case of an exception.


The most preferable solution is to use InputStreamResource with ResponseEntity. All you need is set Content-Length manually:

@RequestMapping(value = "/download", method = RequestMethod.GET)
public ResponseEntity download() throws IOException {
    String filePath = "PATH_HERE";
    InputStream inputStream = new FileInputStream(new File(filePath));
    InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentLength(Files.size(Paths.get(filePath)));
    return new ResponseEntity(inputStreamResource, headers, HttpStatus.OK);
}