【问题标题】:Consuming Spring Boot StreamingResponseBody from Angular HttpClient从 Angular HttpClient 使用 Spring Boot StreamingResponseBody
【发布时间】:2019-12-08 15:08:19
【问题描述】:

我有一个 Spring Boot 应用程序,它提供 100 张压缩并通过 StreamingResponseBody 发送的图像,有没有办法从 Angular 应用程序中使用此服务?

@GetMapping(value = "/initialize")
public ResponseEntity<StreamingResponseBody> initializeSlider(final HttpServletResponse response,
                                                              String axis,String nodeId) {
    Long totalCount = imageRepository.countImageByAxisAndNodeId(axis,nodeId);

    int interval =  Math.round(totalCount / 50) ;

    List<Integer> sequenceList = new ArrayList<>();

    for(int i=0;i<totalCount;i=i+interval){
        int nextSequence = i + interval;
        sequenceList.add(nextSequence);
    }

    System.out.println(sequenceList.toString());
    System.out.println(sequenceList);

    response.setContentType("application/zip");
 //   response.setHeader("Content-Disposition", "attachment;filename=sample.zip");

    StreamingResponseBody stream = out -> {
        final ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
        List<Image> imageList = imageRepository.findImageBySequenceIdIn(sequenceList);

        try {
            imageList.stream().forEach(image -> {
                try {
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(bos);
                    oos.writeObject(image);
                    oos.flush();
                    byte [] data = bos.toByteArray();
                    final InputStream inputStream = new ByteArrayInputStream(data);
                    final ZipEntry zipEntry = new ZipEntry(image.getName());
                    zipOut.putNextEntry(zipEntry);
                    //IOUtils.copy(inputStream,zipOut);
                    byte[] bytes = new byte[1024];
                    int length;
                    while ((length = inputStream.read(bytes)) >= 0) {
                        zipOut.write(bytes, 0, length);
                    }
                    zipOut.closeEntry();
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            zipOut.flush();
            zipOut.close();
        }
    };

    System.out.println(stream);
    logger.info("steaming response {} ", stream);
    return new ResponseEntity(stream, HttpStatus.OK);
}

【问题讨论】:

标签: angular spring-boot


【解决方案1】:

您可以尝试使用{ responseType: 'blob' } 作为选项。

要下载文件,您可以使用file-saver

import { saveAs } from 'file-saver';

this.http.get(url, { responseType: 'blob' }).subscribe((resp: any) => {
    FileSaver.saveAs(resp, `abc.zip`);
})

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2021-01-28
    • 2019-04-21
    • 2018-12-19
    • 2019-07-04
    • 2021-11-03
    • 2021-11-07
    • 2017-07-10
    • 2019-03-11
    相关资源
    最近更新 更多