file download via http post is returning the zip file contents

杀马特。学长 韩版系。学妹 提交于 2021-01-28 07:33:00

问题


I could see many related topics, but I have a specific problem. I am using spring boot controller to download a zip file. I am able to download the file when it is http verb get, but as I have to pass a big json payload I changed to post. Since then instead of downloading it as file it is responding the contents of the file with some ascii characters. Below is the method in controller for downloading the file.

@ApiResponses(value = { @ApiResponse(code = 404, message = "file could not be found"),
        @ApiResponse(code = 200, message = "File was created sucessfully") })
@PostMapping(path="/download-file/1.0", produces="application/zip")
public ResponseEntity<InputStreamResource> downloadFile(
        @ApiParam(value = "File creation contents", required = true) @RequestBody InputDetailsVO inputDetailsVO) {
    File file = null;
    InputStreamResource resource = null;
    HttpHeaders headers = new HttpHeaders();
    try {
        //Creating InputStreamResource out of zip file
        resource = new InputStreamResource(new FileInputStream(file));          
        String contentType = "application/zip";
        if (!StringUtils.isEmpty(contentType)) {
           headers.setContentType(MediaType.parseMediaType(contentType));
        }
        headers.add("Content-Disposition","attachment; filename=\""+file.getName()+"\"");
    } catch (Exception e) {
        log.error("Issue with file creation",e);

    }
    return ResponseEntity.ok()
            .contentLength(file.length())
            .contentType(MediaType
                          .parseMediaType(MediaType.APPLICATION_OCTET_STREAM_VALUE))
             .headers(headers).body(resource);
}   

Below is the response I am getting instead of file download

    PK;��N <?xml version="1.0" encoding="UTF-8"?>
<employeeDetails>
<name>Harry</name>
<age>30</30>
<email>test@test.com</test>
</employeeDetails>PK�qB�@Y;YPK;��N�qB�@Y;Yemployee details.xmlPKL�Y

回答1:


Try like this, you can download any type of file. I assume that InputDetailsVO contains the name of the file or you can have your own logic to pick the file name. On the top of this method, you can provide swagger related annotations.

@PostMapping(value = "/download-file/1.0", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
  public ResponseEntity<?> downloadFile(@RequestBody InputDetailsVO inputDetailsVO) {
    String dirPath = "your-location-path";
    byte[] fileBytes = null;
    try {
       String fileName = inputDetailsVO.getFileName();
      fileBytes = Files.readAllBytes(Paths.get(dirPath + fileName));
    } catch (IOException e) {
      e.printStackTrace();
    }
    return ResponseEntity.ok()
        .contentType(MediaType.APPLICATION_OCTET_STREAM)
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
        .body(fileBytes);
  }



回答2:


I also had a similar use case. I am sharing the code which had solved the issue.

  @RequestMapping(value="/download",method=RequestMethod.GET,produces="application/zip" )
        public ResponseEntity<?> download(HttpServletResponse response) throws IOException
        {
            //Some Code...

            File file = new File("F:\\Folder\\Folder\\Folder\\"+filename); 
            InputStreamResource resource2 = new InputStreamResource(new FileInputStream(file));
            response.setContentType("application/zip");
            response.setHeader("Content-Disposition", String.format("inline; filename=\"" + filename + "\""));
            response.setHeader("responseType", "arraybuffer");
            response.setHeader("Content-Length", ""+file.length());

            return new ResponseEntity<InputStreamResource>(resource2,HttpStatus.ACCEPTED);

        }


来源:https://stackoverflow.com/questions/56479684/file-download-via-http-post-is-returning-the-zip-file-contents

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!