Spring REST / Swagger / Postman – 已下载损坏/空白文件

我按照这篇文章的function:客户端可以下载文件(即csv,pdf和zip)。

但要么我得到的pdf是空白的,要么尝试使用zip文件时,它会受到损坏。 只有CSV工作正常

我检查了标题,一切看起来都符合标准。 我甚至没有使用“application / octet-stream”和pdf使用“application / pdf”,csv使用“application / csv”,zip使用“application / zip”只是为了避免客户端出现任何问题。 我正在使用swagger 2.4测试我的apis。 这是我的代码。

@CrossOrigin @Controller public class ReportRestController { @Autowired ReportService reportService; @Value("${report.temp.directory}") // used for storing file in local private String reportLocation; @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Authorization", required = true, dataType = "string", paramType = "header"), @ApiImplicitParam(name = "Auth-Provider", value = "Auth-Provider", required = true, dataType = "string", paramType = "header"),}) @RequestMapping(value = "/report/{type}/{format}", method = RequestMethod.POST) public void getList(@RequestHeader(value = "UserId", required = false) Long userId, @RequestHeader(value = "TeamId", required = false) Long teamId, @RequestHeader(value = "CustomerId", required = true) Long customerId, @PathVariable("type") String type, @PathVariable("format") String formate, @RequestBody ReportRequestObj reportobj, HttpServletResponse response) { String filename = reportService.getReport(customerId, userId, teamId, type, formate, reportobj); Path pathfile = Paths.get(reportLocation, filename); File file = pathfile.toFile(); if (file.exists()) { String fileExtension = FilenameUtils.getExtension(filename); if(CommonConstants.CSV.equals(fileExtension)){ response.setContentType("application/csv"); }else if(CommonConstants.PDF.equals(fileExtension)){ response.setContentType("application/pdf"); }else if(CommonConstants.ZIP.equals(fileExtension)){ response.setContentType("application/zip"); } response.addHeader("Content-Disposition", "attachment; filename=" + filename); response.setContentLength((int) file.length()); response.setHeader("Content-Transfer-Encoding", "binary"); try(FileInputStream fileInputStream = new FileInputStream(file)) { IOUtils.copy(fileInputStream,response.getOutputStream()); response.getOutputStream().flush(); //response.flushBuffer(); } catch (IOException ex) { log.error("Error while sending the file:{} for customerId:{} ,userId:{}", file.getPath(), customerId, userId); } } } 

请让我知道我做错了什么或错过了什么?

编辑1:我附上了我得到的响应标题:

 { "date": "Sun, 01 Jan 2017 19:11:13 GMT", "x-content-type-options": "nosniff", "access-control-max-age": "3600", "content-disposition": "attachment; filename=localhost-blob-abcd.pdf", "content-length": "172962", "x-xss-protection": "1; mode=block", "x-application-context": "report-server:8095", "pragma": "no-cache", "server": "Apache-Coyote/1.1", "x-frame-options": "DENY", "access-control-allow-methods": "POST, PUT, GET, OPTIONS, DELETE", "content-type": "application/pdf;charset=UTF-8", "access-control-allow-origin": "*", "cache-control": "no-cache, no-store, max-age=0, must-revalidate, no-cache", "access-control-allow-headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, Auth-Provider, UserId, TeamId, Lang, CustomerId", "expires": "0" } 

好的,这段代码对我有用:

 package com.example; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import javax.servlet.http.HttpServletResponse; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.io.InputStreamResource; import org.springframework.http.CacheControl; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Controller public class DownloadController { @RequestMapping("/download") public ResponseEntity download() throws FileNotFoundException { final File file = new File("file.pdf"); return ResponseEntity.ok() .contentLength(file.length()) .contentType(MediaType.APPLICATION_PDF) .cacheControl(CacheControl.noCache()) .header("Content-Disposition", "attachment; filename=" + file.getName()) .body(new InputStreamResource(new FileInputStream(file))); } } } 

没有什么特定的Spring Boot,你可以使用普通的Spring MVC。

也许这是一个像这样的Swagger问题: 通过content-disposition标题文件下载损坏文件 ,而不是服务器端文件 。 您是否尝试使用其他工具测试此API调用? 例如curl永远不会让我失望。