Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 订阅';无法收到下载文件的响应_Angular_Spring Mvc_Httpresponse - Fatal编程技术网

Angular 订阅';无法收到下载文件的响应

Angular 订阅';无法收到下载文件的响应,angular,spring-mvc,httpresponse,Angular,Spring Mvc,Httpresponse,在我的项目中,我将angular6与Springboot后端一起使用。所以我要做的是使用这个控制器java类弹出保存对话框 @RequestMapping(value = "/getGeneratedLetter/{userId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public void genarateLetter(@PathVariable("userId") Inte

在我的项目中,我将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);
        }
    }
注意:在my
letterTypeService
java类中,将正确生成字母

最后,我在我的组件中捕捉到角度前端的响应

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);
  });
}
在上述函数中,response将不会捕获,因为结果是

错误消息:“OK”

它很混乱,因为它只显示“OK”,没有任何特定的错误详细信息。此外,在我的服务中,前端成功发送get请求,chrome开发工具的网络选项卡显示“状态代码:200”

进一步调查当我在新浏览器窗口中复制并粘贴我的获取请求URL时,信件下载弹出窗口将成功显示,当我单击保存按钮时,信件将成功下载


那么这里的问题是什么呢?

正如M.Deinum所指出的那样。AJAX透明地获取请求,因此不会出现弹出窗口。您可以在客户端中构建链接,然后单击该链接(与将链接复制到新浏览器的情况相同)。例如,我为我的一个应用程序做了类似的事情,我的模板中有以下内容:

 <a [href]="yourUrl" class="btn btn-primary" role="button">
     <i class="fa fa-calendar"></i> <!-- or whatever you want to display -->
 </a>

yourUrl
则是指向后端的url。它应该会弹出一个下载对话框(我没有测试来自后端的文件,但我认为应该可以)

编辑
建议您不能直接使用AJAX下载文件,主要是出于安全原因。显示了如何使用Javascript进行此操作,但它基本上做了相同的事情:它创建一个锚定标记,将数据放入一个,将其添加到DOM中,单击它并再次删除它自己,因此最后会看到一个弹出窗口。笔中的“下载”属性仅适用于相同来源的请求,但由于您设置了
内容处置
标题,因此也可以省略它()。对于Angular,基本上可以将
success:
子句中的代码复制到http调用中(我建议将
var
s替换为
const
s)。然而,它不是干净的,因为您直接与DOM交互,如果您使用服务器端渲染,您必须检查这一点。而且它会导致内存泄漏。

正如M.Deinum所指出的那样。AJAX透明地获取请求,因此不会出现弹出窗口。您可以在客户端中构建链接,然后单击该链接(与将链接复制到新浏览器的情况相同)。例如,我为我的一个应用程序做了类似的事情,我的模板中有以下内容:

 <a [href]="yourUrl" class="btn btn-primary" role="button">
     <i class="fa fa-calendar"></i> <!-- or whatever you want to display -->
 </a>

yourUrl
则是指向后端的url。它应该会弹出一个下载对话框(我没有测试来自后端的文件,但我认为应该可以)

编辑
建议您不能直接使用AJAX下载文件,主要是出于安全原因。显示了如何使用Javascript进行此操作,但它基本上做了相同的事情:它创建一个锚定标记,将数据放入一个,将其添加到DOM中,单击它并再次删除它自己,因此最后会看到一个弹出窗口。笔中的“下载”属性仅适用于相同来源的请求,但由于您设置了
内容处置
标题,因此也可以省略它()。对于Angular,基本上可以将
success:
子句中的代码复制到http调用中(我建议将
var
s替换为
const
s)。然而,它不是干净的,因为您直接与DOM交互,如果您使用服务器端渲染,您必须检查这一点。它可能会导致内存泄漏。

您需要请求选项将用户名/密码作为标题传递。您的控制器中未接收到它。弹出窗口不会出现,因为您正在执行Ajax请求,这是在浏览器的后台处理的。@M.Deinum更新了我的问题,您知道吗?您正在使用Ajax下载文件,因此不会出现弹出窗口,因为请求/响应是透明处理的。@M.Deinum那么我应该如何解决这个问题呢。请你详细说明一下,如果你想要一个弹出窗口而不是一个常规链接,不要使用AJAX。您在后台执行请求,因此所有事情都在后台处理。您需要做额外的工作,请参阅您需要请求选项以将用户名/密码作为头传递。您的控制器中未接收到它。弹出窗口不会出现,因为您正在执行Ajax请求,这是在浏览器的后台处理的。@M.Deinum更新了我的问题,您知道吗?您正在使用Ajax下载文件,因此不会出现弹出窗口,因为请求/响应是透明处理的。@M.Deinum那么我应该如何解决这个问题呢。请你详细说明一下,如果你想要一个弹出窗口而不是一个常规链接,不要使用AJAX。您在后台执行请求,因此所有事情都在后台处理。你需要做额外的工作,谢谢你的回答。我会试试这个,你能告诉我什么是让AJAX请求透明的原因吗?你是生命的救星。这将赢得更多的投票@thomiNP,很高兴我能提供帮助。谢谢你的回答。我会试试这个,你能告诉我什么是让AJAX请求透明的原因吗?你是生命的救星。这将赢得更多的投票@thomiNP,很高兴我能帮上忙。