您的位置 首页 php

SpringMVC返回图片的几种方式

SpringMVC返回图片的几种方式

I. 返回二进制图片

主要借助的是 HttpServletResponse这个对象,实现case如下

注意事项

  • 注意ContentType定义了图片类型

  • 将二进制写入httpServletResponse#getOutputStream

  • 写完之后,flush(),close()请务必执行一次

II. 返回图片的几种方式封装

一般来说,一个后端提供的服务接口,往往是返回json数据的居多,前面提到了直接返回图片的场景,那么常见的返回图片有哪些方式呢?

  • 返回图片的http地址

  • 返回base64格式的图片

  • 直接返回二进制的图片

  • 其他…(我就见过上面三种,别的还真不知道)

那么我们提供的一个Controller,应该如何同时支持上面这三种使用姿势呢?

1. bean定义

因为有几种不同的返回方式,至于该选择哪一个,当然是由前端来指定了,所以,可以定义一个请求参数的bean对象

为了简化判断,定义了两个注解,一个ReturnTypeEnum, 一个 MediaTypeEnum, 当然必要性不是特别大,下面是两者的定义

上面是请求参数封装的bean,返回当然也有一个对应的bean

说明:

实际的项目环境中,请求参数和返回肯定不会像上面这么简单,所以可以通过继承上面的bean或者自己定义对应的格式来实现

2. 返回的封装方式

既然目标明确,封装可算是这个里面最清晰的一个步骤了

说明:

请无视上面的几个自定义异常方式,需要使用时,完全可以干掉这些自定义异常即可;这里简单说一下,为什么会在实际项目中使用这种自定义异常的方式,主要是有以下几个优点

  1. 配合全局异常捕获(ControllerAdvie),使用起来非常方便简单

  2. 所有的异常集中处理,方便信息统计和报警

    如,在统一的地方进行异常计数,然后超过某个阀值之后,报警给负责人,这样就不需要在每个出现异常case的地方来主动 埋点 
  3. 避免错误状态码的层层传递

    - 这个主要针对web服务,一般是在返回的json串中,会包含对应的错误状态码,错误信息- 而异常case是可能出现在任何地方的,为了保持这个异常信息,要么将这些数据层层传递到controller;要么就是存在ThreadLocal中;显然这两种方式都没有抛异常的使用方便 

有优点当然就有缺点了:

  1. 异常方式,额外的性能开销,所以在自定义异常中,我都覆盖了下面这个方法,不要完整的堆栈

2. 编码习惯问题,有些人可能就非常不喜欢这种使用方式

III. 项目相关

只说不练好像没什么意思,上面的这个设计,完全体现在了我一直维护的 开源项目 Quick-Media中,当然实际和上面有一些不同,毕竟与业务相关较大,有兴趣的可以参考

  • QuickMedia:

  • BaseAction: com.hust.hui.quickmedia.web.wxapi.WxBaseAction#buildReturn

IV. 其他

声明

尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见解不全,如有问题,欢迎批评指正

文章来源:智云一二三科技

文章标题:SpringMVC返回图片的几种方式

文章地址:https://www.zhihuclub.com/149311.shtml

关于作者: 智云科技

热门文章

网站地图