做网站的命题依据,百度关键词热搜,苍南网站开发,做网站费用分几块SpringBoot接口中如何直接返回图片数据
目录 接口直接返回图片数据 起因 类似这种 根据个人经验 优雅的实现图片返回 接口直接返回图片数据 起因
最近在做涉及到分享推广的业务#xff0c;需要由业务员分享二维码进入推广页面#xff0c;由于是新项目#xff0c;前期…SpringBoot接口中如何直接返回图片数据
目录 接口直接返回图片数据 起因 类似这种 根据个人经验 优雅的实现图片返回 接口直接返回图片数据 起因
最近在做涉及到分享推广的业务需要由业务员分享二维码进入推广页面由于是新项目前期预算和用量都有限没有搭建对象存储服务所以决定使用后台服务动态生成二维码图片直接图片数据并返回。
首先是二维码的生成决定使用google的zxing毕竟google的东西还是不错的maven添加依赖如下
!-- https://mvnrepository.com/artifact/com.google.zxing/core --dependencygroupIdcom.google.zxing/groupIdartifactIdcore/artifactIdversion3.3.3/version/dependency!-- https://mvnrepository.com/artifact/com.google.zxing/javase --dependencygroupIdcom.google.zxing/groupIdartifactIdjavase/artifactIdversion3.3.3/version/dependency
继续查zxing的使用方法发现大多数都是生成二维码然后写成图片文件的不太适合我现在的情况。 类似这种
Map hints new HashMap();
hints.put(EncodeHintType.CHARACTER\_SET, utf-8);
hints.put(EncodeHintType.ERROR\_CORRECTION, ErrorCorrectionLevel.M);
hints.put(EncodeHintType.MARGIN, 2);
BitMatrix qrcode new QRCodeWriter().encode(href, BarcodeFormat.QR\_CODE, 300, 300);
//网上的方案大多数都是通过io流写到文件系统
MatrixToImageWriter.writeToStream(qrcode,png,response.getOutputStream());
于是企图用response的输出流返回但是返回的数据浏览器看到的全是乱码这种方案并没有成功 根据个人经验
一般这种开源方案既然二维码数据BitMatrix对象都生成了肯定有获取原始数据的方法点进MatrixToImageWriter类搜索方法果然找到了能直接返回BufferedImage对象的方法 现在BufferedImage对象已经有了只差把它扔回前端了继续百度发现可以直接返回该对象类似以下配置
GetMapping(value /qrcode, produces MediaType.IMAGE\_JPEG\_VALUE)
ResponseBody
public BufferedImage generateQRCode() {//返回BufferedImage的对象}
以为问题即将解决然而浏览器访问返回406上网一查原来是没有对应消息类型的转换器导致的有博主提到需要如下配置
Beanpublic BufferedImageHttpMessageConverter addConverter(){return new BufferedImageHttpMessageConverter();}
加了上面的配置后发现问题仍没有解决报错仍是406怀疑配置没有生效于是决定走源码查看原因。debug源码时发现messageConverters的list中确实没有我配置的说明的确是配置问题查找messageConverters的set操作查到如图的地方 发现springMVC是在配置RequestMappingHandlerAdapter设置的HttpMessageConverter进入getMessageConverters()方法 根据我的工地英语8级extendMessageConverters这个方法应该是在添加自定义的HttpMessageConverter进入该方法 空实现很明显估计是模板模式需要自己去扩展于是自己写了一个配置类继承WebMvcConfigurationSupport,重写extendMessageConverters方法 Overrideprotected void extendMessageConverters(ListHttpMessageConverter? converters) {converters.add(new BufferedImageHttpMessageConverter());}
浏览器再访问二维码图片展示问题解决
**总结**实现一个方案的过程中碰到了各种各样的奇怪问题最好的方式是先网上找资料快速解决问题如果无法解决再通过自己走源码的方式从根本原因上寻找出现问题的原因解决问题最复杂的地方是定位问题问题定位了解决便不再是难题 优雅的实现图片返回
注意response.setContentType(“image/png”);这行代码一定要加上
RestController
Slf4j
Api(tags SwaggerConfig.TAG\_IMAGE)
RequestMapping(SwaggerConfig.TAG\_IMAGE)
public class ImageController {Resourceprivate 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();}}}
}以上为个人经验希望能给大家一个参考也希望大家多多支持脚本之家。
您可能感兴趣的文章: 1秒钟实现Springboot 替换/写入 word文档里面的文字、图片功能 SpringBoot上传图片到指定位置并返回URL的实现 springboot实现通过路径从磁盘直接读取图片 1秒实现Springboot 图片添加水印功能 SpringBoot 接口 返回图片 数据
最新评论
如何使用Springredis实现对session的分布式管理
最近更新的内容
java静态代理的含义及用法Java实现MD5加密及解密的代码实例分享学生视角手把手带你写Java 线程池初版Spring Boot Admin实现服务健康预警功能Java实现多人聊天室(含界面)Java 条件控制与循环控制实例SpringBoot整合log4j日志与HashMap的底层原理解析基于StringBuilder类中的重要方法(介绍)java关键字final使用方法详解Spring cloud 查询返回广告创意实例代码