订阅未收到下载文件的响应

贾纳卡·埃卡纳亚克

在我的项目中,我将 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);
        }
    }

注意:在我的letterTypeServicejava 类中,字母将正确生成。

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

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”,没有任何具体的错误细节。此外,在我的前端服务中,chrome 开发工具中的网络选项卡成功发送了获取请求,并显示“状态代码:200”在此处输入图片说明

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

那么这里可能是什么问题呢?

托米

正如 M. Deinum 指出的那样。AJAXGET透明地执行请求,因此不会有弹出窗口。您可以在您的客户端中建立一个链接,您可以单击该链接(就像将链接复制到新浏览器中一样)。例如,我为我的一个应用程序做了类似的事情,我的模板中有以下内容:

 <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 下载文件,主要是出于安全原因。这个 codepen展示了如何用 Javascript 来完成它,但它基本上做同样的事情:它创建一个锚标记,将数据放入objectURL,将其添加到 DOM,单击它并再次删除自身,所以最后你会看到一个弹出。笔中的下载属性仅适用于同源请求,但由于您设置了Content-Disposition标头,因此您也可以将其省略(这里有更多关于此的信息)。为了使其与 Angular 一起使用,您基本上可以将success:子句中的代码复制到您的 http 调用中(我建议将vars替换为consts)。然而,它不是干净的 Angular,因为你直接与 DOM 交互,如果你使用服务器端渲染,你必须检查这一点。它可能会导致内存泄漏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章