是否可以将文件和json数据作为单个响应发送到客户端-Java Spring?

时间:2018-09-26 06:25:59

标签: java angular spring-rest

我想使用Spring rest生成响应。此响应应包括一个excel文件和一些json数据。另外,我想在Angular中解析此响应。

2 个答案:

答案 0 :(得分:0)

E. Sundin 提到过,它是通过服务器上的base64编码并发送包含此base64字符串的json并按以下所示在Angular中解析json来工作的-

Java代码-

            byte[] bytes = null;
            String base64 = null;

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            try {
                workbook.write(bos);
            } finally {
                bos.close();
            }
            bytes = bos.toByteArray();
            base64 = Base64.getEncoder().encodeToString(bytes);

            Map<String, Object> resMap = new HashMap<>();
            resMap.put("failed", 12);
            resMap.put("attempted", 20);
            resMap.put("file", base64);

            return new ResponseEntity(resMap, HttpStatus.OK);

角度代码-

this.service.call().subscribe(data => {
  this.totalFailed = data.failed;
  this.totalUploaded = data.attempted;
  window.open('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,'+ data.file);
});

答案 1 :(得分:0)

Base64编码在技术上可以正常工作,但是请注意,它将给以下人员带来额外的负担:

  • 服务器:实际对值进行编码的计算时间
  • 客户端:有人必须解码值,这又需要时间/ CPU资源
  • 网络,仅因为base64编码数据的大小大于(约30%)初始字节流。请参阅This SO question并回答以了解原因

此外,由于我从事的项目之一具有此功能,因此像这样使用JSON(复制和传播等)非常不方便

如果这是一个可以接受的解决方案,请继续使用它,它将起作用,而且您也不会丢失任何数据。

但是,还有其他方法:

很明显-拆分请求,考虑到我上面已经提到的考虑,您将得出以下结论:对服务器进行两次调用,其中之一将返回JSON,而另一个excel文件将使您更好地工作。

使用某种多部分混合响应,通过这种方法您只能打个电话,但是,这不是如何在客户端上解决这个问题,我不知道角度/浏览器总体上是否支持这一点。