强制从Spring Controller下载CSV

时间:2015-04-10 14:41:31

标签: java spring

我的last issue后续问题已经解决了。

我尝试通过返回@Controller来通过Spring FileSystemResource下载文件。我收到一个有效的HTTP 200响应,可以在浏览器中查看所有文件的内容,但是我从未收到下载该文件的提示。这是我的方法:

@RequestMapping(method = RequestMethod.GET, headers="Accept=*/*", value = "/download/{fileName:.+}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody
public FileSystemResource download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
    File file = new File(path + '/' + fileName);
    response.setContentLength((int)fileName.length());
    response.setContentType("application/force-download");
    response.setHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");//fileName);
    return  new FileSystemResource(file);
}

来自浏览器:

Response Headers
Content-Disposition | attachment; filename="my_data.CSV"
Content-Length  | 1712
Content-Type    | text/csv

Request Headers
Accept          | */*
Accept-Encoding | gzip, deflate
Accept-Language | en-US,en;q=0.5

这里的一切看似有效;知道为什么实际文件没有被退回?干杯

2 个答案:

答案 0 :(得分:2)

下载:我使用:

response.setContentType("application/octet-stream");

请注意您的结果" Content-Type |文本/ CSV"与您设置的内容不匹配

答案 1 :(得分:0)

对我有用的最小值是问题中代码的组合,以及来自@pdem的八位字节流内容类型建议。其他一切似乎都是不必要的:

@GetMapping(value = "/testcsv")
public @ResponseBody String getFile(HttpServletResponse response){
  String test = "test1, test2, test3";
  response.setContentType("application/octet-stream");
  response.setHeader("Content-Disposition","attachment; filename=\"test.csv\"");
  return test;
}