SpringBoot优雅的实现图片返回

废话少说,直接干货:spring

前提:添加图片转换器json

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

至此....OKspringboot

相关文章
相关标签/搜索