ajax和spring mvc下载文件

时间:2017-09-12 22:40:01

标签: ajax spring spring-mvc asynchronous

我的任务是按下按钮下载文件。应从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();
	}

  
  

1 个答案:

答案 0 :(得分:0)

你说在生产中不起作用。是否有服务器集群或什么?也许文件创建的请求由实例参与,当您尝试获取文件时,另一个正在响应