Send large files like ISO via Java REST

I am creating a REST service that will send large files, such as an ISO image, but I'm currently getting an error from memory. Below is my code

@RequestMapping(value = URIConstansts.GET_FILE, produces = { "application/json" }, method = RequestMethod.GET)
public @ResponseBody ResponseEntity getFile(@RequestParam(value="fileName", required=false) String fileName,HttpServletRequest request) throws IOException{

    ResponseEntity respEntity = null;

    byte[] reportBytes = null;
    File result=new File("/home/XXX/XXX/XXX/dummyPath/"+fileName);

    if(result.exists()){
        InputStream inputStream = new FileInputStream("/home/XXX/XXX/XXX/dummyPath/"+fileName); 
        String type=result.toURL().openConnection().guessContentTypeFromName(fileName);

        byte[]out=org.apache.commons.io.IOUtils.toByteArray(inputStream);

        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.add("content-disposition", "attachment; filename=" + fileName);
        responseHeaders.add("Content-Type",type);

        respEntity = new ResponseEntity(out, responseHeaders,HttpStatus.OK);


    }else{

        respEntity = new ResponseEntity ("File Not Found", HttpStatus.OK);
    }


    return respEntity;

}
+4
source share
1 answer

It looks like you need to use InputStreamResource to return the stream instead of the whole file at once.

    package app.controller;

    import org.springframework.core.io.InputStreamResource;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;

    @org.springframework.web.bind.annotation.RestController
    @RequestMapping(path = {"/rest"})
    public class RestController {

        @RequestMapping(value = "/getISO", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
        public ResponseEntity getIsoFile(@RequestParam(value="filePath", required = true) String filePath) throws FileNotFoundException {
            File file = new File(filePath);
            FileInputStream inputStream = new FileInputStream(file);
            InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentLength((int)file.length());
            return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);
        }
    }

, MediaType.APPLICATION_OCTET_STREAM_VALUE application/json .

, .

+1

Source: https://habr.com/ru/post/1610069/


All Articles