zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Ext的组件结构分析(转)
    分析模式 责任模式
    Nhibernate学习起步之manytoone篇(转 明了篇)
    企业开发框架NHibernate和Spring.Net简介3
    企业开发框架NHibernate和Spring.Net简介4
    NHibernate Cascades: the different between all, alldeleteorphans and saveupdate
    XML与数据库
    企业开发框架NHibernate和Spring.Net简介1
    python对函数的理解
    seleniumwebdriver(python) (十五) 鼠标事件
  • 原文地址:https://www.cnblogs.com/Baker-Street/p/12918295.html
Copyright © 2011-2022 走看看