请求具有图像内容类型示例的 Reactive Server 响应

Request for Reactive Server response with image content type Sample

我正在开始一个新项目并采用 spring webflux 作为反应式休息框架。我有一个 return 后端验证码图像的用例。我有一个示例代码如下,它使用 spring 框架生成验证码图像和 return,但现在我不知道如何以反应方式 return 图像。

这是我在 Spring MVC 方式中的用例:

@RequestMapping(value="/captcha/{id:.+}", produces = MediaType.IMAGE_JPEG_VALUE)
public @ResponseBody byte[] captcha(@PathVariable("id") String captchaId,  HttpServletResponse res) throws Exception{

      try{
         byte [] captchaImg = (byte[])cacheService.getValue(captchaId,    AuthConstants.CACHE_CAPTCHA_IMG_KEY);

         return captchaImg;
      }catch(Exception e){
        res.setStatus(HttpStatus.NOT_FOUND.value());
        return null;
      }
}

反应式失败代码如下:

public Mono<ServerResponse> captchaImage(ServerRequest request) {

        return Mono.just(request.pathVariable("id"))
                .flatMap(id->cacheService.getValue(id, AuthConstant.CACHE_CAPTCHA_IMG_KEY))
                .flatMap(captchaImage-> {
                    System.out.println("img:"+captchaImage);
                    return ServerResponse
                            .ok()
                            .contentType(MediaType.IMAGE_JPEG)
                            .body(BodyInserters.fromObject(captchaImage));
                });

    }

这段代码失败了,我找不到任何信息来了解如何做。

我需要你的帮助。感谢您提供一些代码片段。

谢谢

我想我找到了答案。

public Mono<ServerResponse> captchaImage(ServerRequest request) {
        return Mono.just(request.pathVariable("id"))

                //get the image from redis in byte[]
                .flatMap(id->genericHashOperations.opsForHash().get(id,AuthConstant.CACHE_CAPTCHA_IMG_KEY)
                .flatMap(cimg->{

                    byte[] i = (byte[]) cimg;

                    //use data Buffer to wrap the image in byte array
                    DataBuffer buffer = new DefaultDataBufferFactory().wrap(i);

                    return ServerResponse
                            .ok()
                            .contentType(MediaType.IMAGE_JPEG)
                            .body(BodyInserters.fromDataBuffers(Flux.just(buffer)));
                }));
    }