【发布时间】:2019-09-05 12:03:43
【问题描述】:
在我的项目中,我使用 angular6 和 Springboot 后端。所以我想做的是使用这个控制器java类弹出保存对话框,
@RequestMapping(value = "/getGeneratedLetter/{userId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public void genarateLetter(@PathVariable("userId") Integer userId, HttpServletResponse response) {
System.out.println(userId);
letterTypeService.genarateLetter(userId);
try {
// get Letter.docx from file path
InputStream is = new FileInputStream("Letter.docx");
response.setHeader("Content-Disposition", "attachment; filename = Letter.docx");
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
} catch (Exception ex) {
throw new RuntimeException("IOError in " + ex);
}
}
注意:在我的letterTypeService java 类中,字母会正确生成。
最后,我在组件的 Angular 前端捕捉到响应,
getGenaratedLetterTemplate(letter) {
this.data.getGenaratedLetterTemplate(letter.letterId).subscribe(response => {
this.getBasicDataFromBackend();
saveAs(response, letter.fullName + '_' + letter.letterTypeName + '.docx');
console.log(response);
}, error => {
console.log(error);
});
}
在上面的函数中,响应不会被捕获,因为结果是
错误消息:“OK”
这很令人困惑,因为它只显示“OK”,没有任何具体的错误详细信息。此外,在我的前端服务中成功发送获取请求,并且 chrome 开发工具中的网络内选项卡显示“状态代码:200”
进一步调查当我在新的浏览器窗口中复制并粘贴我的获取请求 URL 时,将成功显示信件下载弹出窗口,当我点击保存按钮时,信件将成功下载。
那么这里可能是什么问题?
【问题讨论】:
-
您需要请求选项以将用户名/密码作为标头传递。它没有在您的控制器中收到。不会出现弹出窗口,因为您正在执行 Ajax 请求,该请求是在浏览器后台处理的。
-
@M.Deinum 更新了我的问题,你有什么想法吗?
-
您正在使用 AJAX 下载文件,因此请求/响应是透明处理的,因此不会弹出窗口。
-
@M.Deinum 那么我应该怎么做才能解决这个问题。请您详细说明一下?
-
如果您想要一个弹出窗口但想要一个常规链接,请不要使用 AJAX。您正在后台执行请求,因此所有内容都在后台处理。你需要做额外的工作,见stackoverflow.com/questions/35138424/…
标签: angular spring-mvc httpresponse