springboot图片上传接口,springboot 图片下载接口

  springboot图片上传接口,springboot 图片下载接口

  00-1010接口直接返回图片数据就是因为这种根据个人经验优雅的实现图片返回。

  

目录

 

  00-1010最近在做涉及分享推广的业务,业务员需要分享二维码才能进入推广页面。由于是新项目,前期预算和使用量有限,没有对象存储服务,所以决定使用后台服务动态生成二维码图片并返回。

  首先是二维码的生成,我决定用谷歌的zxing。毕竟谷歌的东西还是不错的。maven添加了如下依赖项:

  !-https://mvnrepository.com/artifact/com.google.zxing/core-依赖groupIdcom.google.zxing/groupId artifact id core/artifact id版本3.3.3/version /dependency!-https://mvnrepository.com/artifact/com.google.zxing/javase-依赖groupIdcom.google.zxing/groupId artifactId javase/artifactId Version 3 . 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。保证金,2);bit matrix QR code=new QR code writer()。encode(href,BarcodeFormat。QR_CODE,300,300);//大部分在线方案都是通过io流,MatrixToMageWriter写入文件系统。写至流(二维码, PNG ,响应。get output Stream());于是我尝试用response的输出流返回,但是返回的数据浏览器看到的都是乱码,这个方案没有成功。

 

  00-1010一般来说,既然已经生成了二维码数据的BitMatrix对象,就一定有办法获取原始数据。点击MatrixToImageWriter类搜索方法,果然找到了一个可以直接返回BufferedImage对象的方法。

  现在,BufferedImage对象已经存在,只需要把它扔回前端。继续百度,发现可以直接返回对象,类似于下面的配置。

  @GetMapping(value=/qrcode ,Produces=media type . image _ JPEG _ value)@ response body public buffered image generate QR code(){//返回缓冲图像的对象}以为问题即将解决,浏览器访问却返回406。网上查了一下,原来是没有对应消息类型的转换器。有博主提到需要以下配置。

  @ Bean public BufferedImageHttpMessageConverter add converter(){ return new BufferedImageHttpMessageConverter();}添加了上面的配置后,发现问题还是没有解决,错误还是406。我怀疑配置没生效,决定去源码查一下原因。调试源代码的时候发现没有在messageConverters列表中配置,说明确实是配置问题。寻找messageConverters的set操作,找到如图所示的地方。

  发现springMVC正在配置RequestMappingHandlerAdapter设置的HttpMessageConverter,进入getMessageConverters()方法。

  根据我的网站英语8级,extendMessageConverters的这个方法应该是添加一个自定义的HttpMessageConverter,并输入这个方法。

  空实现,明显估计是模板模式,需要自己扩展,所以我写了一个配置类继承WebMvcConfigurationSupport,重写extendMessageConverters方法。

  @ Override protected void extendMessageConverters(lishttpmessageconverter?converters){ converters . add(new BufferedImageHttpMessageConverter());}浏览器再次访问,二维码图片显示,问题解决

  总结:在实施计划的过程中遇到了各种奇怪的问题。最好的办法是先在网上找资料,快速解决问题。如果解决不了,可以自己去翻源代码,找到问题的根源。解决问题最复杂的地方就是定位问题。问题一旦定位,解决方案就不再是难题。

  00-1010注意:response . set content type( image/png );必须添加这行代码

  @ rest controller @ Slf4j @ Api(tags=SwaggerConfig .TAG _ IMAGE)@请求映射(swagger配置.标签_图像)公共类ImageController { @资源私有响应响应;@ get mapping(value=/getImage )@ API operation(获取图片-以后台以流流形式写回)public void getImage()抛出io异常{输出流OS=null尝试{//读取图片buffered image image=imageio . read(新文件输入流(新文件( F:\谷歌下载\未命名文件.png’))))));回应。设置内容类型(“图像/png”);OS=响应。获取输出流();如果(图片!=null) { ImageIO.write(image, png ,OS);} } catch(io异常e){ log。错误(获取图片异常{} ,e . getmessage());}最后{ if (os!=null){ OS。flush();OS。close();} } }}以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行它.

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: