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 { return ImageIO.read(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 = ImageIO.read(new FileInputStream(new File("F:\\谷歌下载\\未命名文件.png"))); response.setContentType("image/png"); os = response.getOutputStream(); if (image != null) { ImageIO.write(image, "png", os); } } catch (IOException e) { log.error("获取图片异常{}",e.getMessage()); } finally { if (os != null) { os.flush(); os.close(); } } } }
至此....OK
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示