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

Is it possible to send file and json data as a single response to the client - Java Spring?

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

作为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);

Angular代码-

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);
});

Base64 编码在技术上是可行的,但是,请注意,它会给以下方面带来额外的负担:

  • 服务器:实际编码值的计算时间
  • 客户端:有人必须解码值,同样需要 time/CPU 资源
  • 网络,只是因为 base64 编码数据的大小比初始字节流大 (~30%)。查看 并回答以了解原因

另外由于我做的一个项目有这个功能,这样使用JSON很不方便(复制传播等)

如果它仍然是一个可以接受的解决方案,那就去做吧,它会起作用,而且您不会丢失数据或其他东西。

但是,还有其他方法:

显然 - 拆分请求,考虑到我上面提出的注意事项,您会得出一个结论,即对服务器进行两次调用,其中一次将 return JSON和其他 excel 文件会更好。

使用某种多部分混合响应,通过这种方法你会得到一个调用,但是,这不是在客户端处理这个问题的方法,我不知道 angular / 浏览器是否一般支持这个。