廢話少說,直接乾貨: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