SpringBoot优雅的实现图⽚返回
springboot原理图解废话少说,直接⼲货:
前提:添加图⽚转换器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 增加图⽚转换器
* @param converters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new BufferedImageHttpMessageConverter());
}
}
然后就可以直接写业务代码了,⽹上有很多⼀⾏代码搞定的,,本⼈亲测确实有效,代码如下:
@RestController
@Slf4j
@Api(tags = SwaggerConfig.TAG_IMAGE)
@RequestMapping(SwaggerConfig.TAG_IMAGE)
public class ImageController {
//通过produces 告知浏览器我要返回的媒体类型
@GetMapping(value = "/getImage2", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_PNG_VALUE})
@ApiOperation("获取图⽚-返回BufferedImage")
public BufferedImage getImage2() throws IOException {
ad(new FileInputStream(new File("H:\\Pictures\\6f31c1a2gw6dcdoigmeftj.jpg")));
}
}
但是,坑来了..........按上⾯这种写法在没有任何错误情况下确实能正常返回图⽚,,,
但是在实际开发开发中,,springboot项⽬⼀般会做统⼀的异常处理( json格式结果集返回 )且⼀般会做security的安全认证,,当认证不通过时,,我们是希望得到统⼀的封装的返回信息(如:认证失败的提⽰),,
问题就出在这⾥了:这种写法在认证不通过时,,并不会返回认证失败的提⽰,,⽽是报错,,错误信息如下:
原因很简单:就是当认证失败时,,统⼀的异常处理是要返回⼀个json格式结果集,,但是该接⼝规定了返回的类型为MediaType的图⽚类型,,两者冲突了
最后,,经测试,,改写成如下写法(ImageIo流的形式写回图⽚)可保证认证失败时,返回认证失败信息,,
认证成功后,,也能正常返回图⽚
注意: response.setContentType("image/png");这⾏代码⼀定要加上
@RestController
@Slf4j
@Api(tags = SwaggerConfig.TAG_IMAGE)
@RequestMapping(SwaggerConfig.TAG_IMAGE)
public class ImageController {
@Resource
private HttpServletResponse response;
@GetMapping(value = "/getImage")
@ApiOperation("获取图⽚-以ImageIO流形式写回")
public void getImage() throws IOException {
OutputStream os = null;
try {
// 读取图⽚
BufferedImage image = ad(new FileInputStream(new File("F:\\⾕歌下载\\未命名⽂件.png")));
response.setContentType("image/png");
os = OutputStream();
if (image != null) {
ImageIO.write(image, "png", os);
}
} catch (IOException e) {
<("获取图⽚异常{}",e.getMessage()); } finally {
if (os != null) {
os.flush();
os.close();
}
}
}
}
⾄此....OK
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论