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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM