Можно ли отправить файл и данные JSON как один ответ клиенту - Java Spring? - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу сгенерировать ответ, используя Spring rest.Этот ответ должен включать в себя файл Excel и некоторые данные JSON.Также я хочу разобрать этот ответ в Angular.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Кодирование Base64 будет работать технически, однако, будьте осторожны, это создаст дополнительную нагрузку на:

  • Сервер: время вычислений для фактического кодирования значения
  • Клиент: кто-то должензначение декодирования, опять же, это требует времени / ресурсов ЦП
  • Сеть, только потому, что закодированные в base64 данные по размеру больше (~ 30%), чем исходный поток байтов.См. Этот SO-вопрос и ответ, чтобы понять, почему

Кроме того, поскольку один из проектов, над которыми я работал, имеет эту функцию, очень неудобно использовать JSON, подобный этому (копировать и распространять).и т. д.)

Если это, тем не менее, приемлемое решение, воспользуйтесь им, оно сработает, и вы не потеряете данные или что-то в этом роде.

Однако есть и другие подходы:

Очевидно - разделите запросы, возможно, с учетом соображений, которые я изложил выше, вы придете к выводу, что два обращения к серверу, один из которых вернет JSON, а другой файл Excel, будут работать лучше.

Используя какой-то многочастный смешанный ответ, при таком подходе вы получаете один вызов, однако, это не то, как справиться с этим на стороне клиента, я не знаю, поддерживает ли angular / browser вообще это.

0 голосов
/ 27 сентября 2018

Как E.Упомянутое Sundin , оно работало путем кодирования base64 на сервере и отправки json, который включает эту строку base64, и анализа json в Angular, как показано ниже -

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