后端提供服务,通常返回的json串,但是某些场景下可能需要直接返回二进制流,如一个图片编辑接口,希望直接将图片流返回给前端,此时可以怎么处理?
<强>我。返回二进制图片强>
主要借助的是HttpServletResponse这个对象,实现情况如下
@RequestMapping(值=https://www.yisu.com/zixun/{/img/渲染”}={RequestMethod方法。,RequestMethod。帖子,RequestMethod.OPTIONS}) @CrossOrigin(起源=?”) @ResponseBody 公共字符串执行(HttpServletRequest HttpServletRequest HttpServletResponse HttpServletResponse) {//img为图片的二进制流 byte [] img=xxx; httpServletResponse.setContentType(“图像/png”); OutputStream os=httpServletResponse.getOutputStream (); os.write (img); os.flush (); os.close (); 返回“成功”; } >之前注意事项
<李>注意ContentType定义了图片类型李> <李>将二进制写入httpServletResponse # getOutputStream李> <李>写完之后,冲洗(),()请务必执行一次李>
二世。返回图片的几种方式封装
一般来说,一个后端提供的服务接口,往往是返回json数据的居多,前面提到了直接返回图片的场景,那么常见的返回图片有哪些方式呢?
<李>返回图片的http地址李> <李>返回base64格式的图片李> <李>直接返回二进制的图片李> <李>其他…(我就见过上面三种,别的还真不知道)李>
那么我们提供的一个控制器,应该如何同时支持上面这三种使用姿势呢?
<强> 1。豆定义强>
因为有几种不同的返回方式,至于该选择哪一个,当然是由前端来指定了,所以,可以定义一个请求参数的bean对象
@ data 公开课BaseRequest { 私有静态最终长serialVersionUID=1146303518394712013 l;/* * *输出图片方式: * * url: http地址(默认方式) * base64: base64编码 *流:直接返回图片 * */私人字符串outType;/* * *返回图片的类型 * jpg | png | webp | gif */私人字符串mediaType; 公共ReturnTypeEnum returnType () { 返回ReturnTypeEnum.getEnum (outType); } 公共MediaTypeEnum mediaType () { 返回MediaTypeEnum.getEnum (mediaType); } } >之前为了简化判断,定义了两个注解,一个ReturnTypeEnum,一个MediaTypeEnum,当然必要性不是特别大,下面是两者的定义
公共enum ReturnTypeEnum { 网址(URL), 流(“流”), BASE64(“基地”); 私人字符串类型; ReturnTypeEnum (String类型){ 这一点。类型=类型; } 私有静态Map<字符串,ReturnTypeEnum>地图; 静态{ 地图=new HashMap<比;(3); (ReturnTypeEnum e: ReturnTypeEnum.values ()) { map.put (e。类型,e); } } 公共静态ReturnTypeEnum getEnum (String类型){ 如果(type==null) { 返回的URL; } ReturnTypeEnum e=map.get (type.toLowerCase ()); 返回e==null & # 63;URL: e; } } >之前@ data 公共enum MediaTypeEnum { ImageJpg (“jpg”、“图像/jpeg”、“FFD8FF”), ImageGif (“gif”、“图像/gif”、“47494638”), ImagePng (“png”、“图像/png”、“89504 e47”), ImageWebp (“webp”、“图像/webp”、“52494646”), 私人ext最终字符串; 私人mime最终字符串; 私人最终字符串魔法; mime ext MediaTypeEnum(字符串,字符串,字符串魔法){ 这一点。ext=ext; 这一点。mime=mime; 这一点。魔法=魔法; } 私有静态Map<字符串,MediaTypeEnum>地图; 静态{ 地图=new HashMap<比;(4); (MediaTypeEnum e:值()){ map.put (e.getExt (), e); } } 公共静态MediaTypeEnum getEnum (String类型){ 如果(type==null) { 返回ImageJpg; } MediaTypeEnum e=map.get (type.toLowerCase ()); 返回e==null & # 63;ImageJpg: e; } } >之前上面是请求参数封装的bean,返回当然也有一个对应的bean
@ data 公开课BaseResponse {/* * *返回图片的相对路径 */私人字符串路径;/* * *返回图片的https格式 */私人字符串url;/* * * base64格式的图片 */私人字符串基地; }SpringMVC返回图片的几种方式(小结)