从Spring Rest Controller下载文件

时间:2017-05-17 14:46:16

标签: excel spring rest controller downloading

我正在尝试通过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文件。

3 个答案:

答案 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);
}