我正在尝试通过Spring REST Controller下载文件。以下是我的代码 -
@RequestMapping(value="/aaa",method=RequestMethod.GET,produces=MediaType.APPLICATION_OCTATE_STREAM_VALUE)
public ResponseEntity<byte[]> testMethod(@RequestParam("test") String test) {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentDispositionFromData("attachment","testExcel.xlsx");
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
File file = new File("C:\\testExcel.xlsx");
Path path = Paths.get(file.getAbsolutePath());
ByteArrayResource resource = new ByteArrayResource(Files.readAllbytes(path));
return new ResposeEntity<byte[]>(resource.getByteArray(),responseHeaders,HttpStatus.OK);
}
点击按钮调用此方法。点击按钮后没有任何反应。在调试这个java时,我可以看到字节流。在Mozilla的开发人员工具中,我可以看到成功的HTTP响应(该excel文件的字节流中的响应)。根据互联网上可用的资源,浏览器应该自动下载文件,但是没有发生。
为什么在浏览器中没有发生下载?我还需要做些什么才能让它发挥作用?
注意:这仅用于POC目的。实际上,我必须通过Apache POI或其他API从数据库详细信息生成excel文件。
答案 0 :(得分:1)
以下内容适用于我:
@RequestMapping("/")
public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {
FileInputStream inputStream = new FileInputStream(new File("C:\\work\\boot\\pom.xml"));
response.setHeader("Content-Disposition", "attachment; filename=\"testExcel.xlsx\"");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
ServletOutputStream outputStream = response.getOutputStream();
IOUtils.copy(inputStream, outputStream);
outputStream.close();
inputStream.close();
}
答案 1 :(得分:0)
在我的情况下,有效的方法是使服务器发送以下标头:
Access-Control-Expose-Headers: Content-Disposition
所以我的问题与CSRF问题有关。
答案 2 :(得分:0)
像这样更改代码:
public HttpEntity<byte[]> testMethod(@RequestParam("test") String test) {
File file = new File("C:\\testExcel.xlsx");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] array = IOUtils.toByteArray(fileInputStream);
HttpHeaders header = new HttpHeaders();
header.set("Content-type","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header.set("Content-Disposition", "attachment; filename=" + nameyouwantsaveyourfile + ".xlsx");
header.setContentLength(array.length);
fileInputStream.close();
return new HttpEntity<byte[]>(array, header);
}