我正在开始一个新项目,并采用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));
});
}
这段代码是失败的,我找不到任何信息来知道如何做。
我需要你的帮助。感谢您可以提供一些代码段。
谢谢
答案 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)));
}));
}