Java 使用ajax和spring控制器处理浏览器文件下载
在一个项目中,我需要将一些参数从ajax POST传递给spring控制器,spring控制器将参数传递回java服务,java服务在服务器上的给定位置生成一个文件,并将文件路径返回给控制器。post控制器将路径重定向到GET控制器。现在,GET控制器应该允许浏览器下载该文件 对我来说,一切都很好,除了最后一步,即GET spring控制器在浏览器中按预期生成响应,但没有弹出用于文件下载的浏览器下载窗口。请有人帮帮我。我已经挣扎了72小时 第一步(ajax请求)工作正常:Java 使用ajax和spring控制器处理浏览器文件下载,java,ajax,spring-mvc,browser,download,Java,Ajax,Spring Mvc,Browser,Download,在一个项目中,我需要将一些参数从ajax POST传递给spring控制器,spring控制器将参数传递回java服务,java服务在服务器上的给定位置生成一个文件,并将文件路径返回给控制器。post控制器将路径重定向到GET控制器。现在,GET控制器应该允许浏览器下载该文件 对我来说,一切都很好,除了最后一步,即GET spring控制器在浏览器中按预期生成响应,但没有弹出用于文件下载的浏览器下载窗口。请有人帮帮我。我已经挣扎了72小时 第一步(ajax请求)工作正常: function e
function exportData(criteria) {
return $http({
method: 'POST',
url: 'export/PDF',
data: criteria,
headers: {'Accept': 'application/pdf'}
});
}
@RequestMapping(value = "export/PDF", method = RequestMethod.POST)
public final String getDataToExportPDF(Model model, @RequestBody String toJsonCriteria,
final RedirectAttributes ra) throws Exception {
try {
AuditInput ai = auditService.formatDataToExport(toJsonCriteria);
List<AuditData> ad = auditService.dataToExport(ai);
logger.info("inside pdf export Post method ");
String path = auditPdfService.createPDFFile(ai, ad);
logger.info("inside export Post method");
logger.info("inside pdf export Post method path: " + path);
ra.addFlashAttribute("path", path);
return "redirect:/download.html";
} catch (Exception e) {
logger.error("inside export/PDF POST catch");
throw new IndiciumException("error creating audit PDF file");
}
}
第二步(后控制器)工作正常:
function exportData(criteria) {
return $http({
method: 'POST',
url: 'export/PDF',
data: criteria,
headers: {'Accept': 'application/pdf'}
});
}
@RequestMapping(value = "export/PDF", method = RequestMethod.POST)
public final String getDataToExportPDF(Model model, @RequestBody String toJsonCriteria,
final RedirectAttributes ra) throws Exception {
try {
AuditInput ai = auditService.formatDataToExport(toJsonCriteria);
List<AuditData> ad = auditService.dataToExport(ai);
logger.info("inside pdf export Post method ");
String path = auditPdfService.createPDFFile(ai, ad);
logger.info("inside export Post method");
logger.info("inside pdf export Post method path: " + path);
ra.addFlashAttribute("path", path);
return "redirect:/download.html";
} catch (Exception e) {
logger.error("inside export/PDF POST catch");
throw new IndiciumException("error creating audit PDF file");
}
}
尝试替换下面的行
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename = " + downloadFile.getName());
response.setHeader("X-Frame-Options", "ALLOWALL");
与:
我用“addHeader”替换了“setHeader”,并在文件名中添加了额外的双引号,为我工作
希望这将对您有所帮助。方法“downloadFile()”是否给出任何错误?不,它是成功的。在firebug中,我可以看到所需的响应,但没有下载文件的提示。但是,我尝试将'products=“application/pdf”'添加到@RequestMapping中,但它抛出错误“not Acceptable 406”。您是说文件下载时没有提示吗?没有。。该文件根本不下载,但响应会写入浏览器,正如我在控制台中看到的那样。据我所知,ajax无法用于下载该文件。.使用submit insteadit在进行您指定的更改后仍会以相同的方式运行。请帮助:(请尝试直接向downloadFile方法发出请求,而不是ajax请求,然后它必须工作。在这种情况下,当我们希望在生成文件之前从前端获得输入值时,如何避免使用ajax。您能提出建议吗?尝试在downloadFile方法内调用getDataToExportPDF方法。