【问题标题】:ajax and spring mvc to download fileajax和spring mvc下载文件
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 2021-03-07
    • 2023-04-07
    • 2012-11-11
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多