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

时间:2018-08-14 08:32:47

标签: spring-webflux

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

这是我在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));
                });

    }

这段代码是失败的,我找不到任何信息来知道如何做。

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

谢谢

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。

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