我的任务是按下按钮下载文件。应从Service获取文件中的数据。我分三步完成了这个方法: 1)Ajax调用第一个控制器。在这个控制器中:创建文件,调用服务,从服务获取数据,写入文件并将fileName返回到AJAX success()回调。 2)使用第一个请求(文件名)的响应,我这样做: window.location.href ='downloadFile /'+ response; 调用将下载文件的第二个控制器。
这种方法完全适用于我的本地计算机。 我的问题是,它发出两个请求,每次请求将被发送到不同的主机(在prod中)。所以它不会在第二个控制器中找到该文件。
所以我不能两次打电话给控制器。当我尝试在一个控制器方法中将这两个方法组合在一起时 - 它不会开始下载文件。 为什么会这样?为什么只有当我将文件名返回到success()回调然后再次调用第二个控制器方法将文件写入HtttpServletResponse时才开始下载。
$.ajax({
type : "GET",
contentType : "application/json",
url : "createFile",
dataType : 'text',
success : function(response) {
console.log(response);
window.location.href = 'downloadFile/' + response;
}
}); <%--end of AJAX call--%>
@RequestMapping(value = "/createFile", method = RequestMethod.GET)
@ResponseStatus(value=HttpStatus.OK)
@ResponseBody String createFile(@RequestParam("startDate") String startDate,
@RequestParam("endDate") String endDate,
@RequestParam("vendorId") String vendorId, HttpServletResponse httpResponse) throws Exception {
File file = new File("mynewfile.csv");
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
List<Data> dataFromService = getDataFromService();
httpResponse.setHeader("Content-Disposition", "attachment; filename=\"" + "mynewfile" + ".csv\"");
httpResponse.setContentType("application/csv");
for (int i = 0; i < dataFromService.size(); i++) {
Data data = dataFromService.get(i);
writer.write(data.getVendorName() + ", "
+ data.getAsin() + ", "
+ data.getReferenceId() + ", "
+ data.getCompleteCount() + "\n");
}
writer.close();
return file.GetName();
}
@RequestMapping(value = "/downloadFile/{file}", method = RequestMethod.GET)
public void downloadFile(File metricsReportFile, HttpServletResponse response) throws Exception {
File metricsReportFile = new File (file);
InputStream is = new FileInputStream(metricsReportFile);
response.setHeader("Content-Disposition", "attachment; filename=" + metricsReportFile.getName() );
FileCopyUtils.copy(is, response.getOutputStream());
response.flushBuffer();
metricsReportFile.delete();
}
答案 0 :(得分:0)
你说在生产中不起作用。是否有服务器集群或什么?也许文件创建的请求由实例参与,当您尝试获取文件时,另一个正在响应