【发布时间】:2018-02-21 12:03:19
【问题描述】:
我的任务是点击按钮下载文件。文件中的数据应从服务中获取。我分三步执行此方法: 1) Ajax 调用第一个控制器。在这个控制器中:创建文件、调用服务、从服务获取数据、写入文件并将文件名返回给 AJAX 成功()回调。 2)使用来自第一个请求(文件名)的响应,我这样做: window.location.href = 'downloadFile/' + 响应; 调用将下载文件的第二个控制器。
这种方法在我的本地计算机上完美运行。 我的问题是,它发出两个请求,每次请求都会发送给不同的主机(在产品中)。所以它不会在第二个控制器中找到文件。
所以我不能两次调用控制器。当我尝试将这两种方法结合在一个控制器方法中时 - 它没有开始下载文件。 为什么会发生?为什么只有当我将文件名返回到 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();
}
【问题讨论】:
-
是否可以在两个用户步骤中执行这些操作,1 创建文件。 2. 点击最近创建的文件链接?
标签: ajax spring spring-mvc asynchronous