首页 文章

使用图像内容类型Sample请求Reactive Server响应

提问于
浏览
0

我正在开始一个新项目并采用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

    我想我找到了答案 .

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

相关问题