小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就不能搞个对象存储服务,比如说 oss、minio?
他理直气壮地反驳道:“谁让你不讲清楚,我去找老板把你开掉!”我瞬间就怂了,说,“来来来,我手把手教你怎么把图片保存到 oss 上,好不好?”
“不用了,还是我来教你吧。”小二非常自信,下面是他在 spring boot 应用中整合 oss 做的记录。
一、开通 oss oss 也就是 object storage service,是阿里云提供的一套对象存储服务,国内的竞品还有七牛云的 kodo和腾讯云的cos。
第一步,登录阿里云官网,搜索“oss”关键字,进入 oss 产品页。
第二步,如果是 oss 新用户的话,可以享受 6 个月的新人专享优惠价,不过续费的时候还是会肉疼。
第三步,进入 oss 管理控制台,点击「bucket 列表」,点击「创建 bucket」。
bucket 的词面意思是桶,这里指存储空间,就是用于存储对象的容器。注意读写权限为“公共读”,也就是允许互联网用户访问云空间上的图片。
第四步,点击「确定」就算是开通成功了。
二、整合 oss 第一步,在 pom.xml 文件中添加 oss 的依赖。
com.aliyun.oss aliyun-sdk-oss 3.10.2 第二步,在 application.yml 文件中添加 oss 配置项。
aliyun: oss: # oss对外服务的访问域名 endpoint: oss-cn-beijing.aliyuncs.com # 访问身份验证中用到用户标识 accesskeyid: ltai5 # 用户用于加密签名字符串和oss用来验证签名字符串的密钥 accesskeysecret: ryn # oss的存储空间 bucketname: itwanger-oss1 # 上传文件大小(m) maxsize: 3 # 上传文件夹路径前缀 dir: prefix: codingmore/images/ 第三步,新增 ossclientconfig.java 配置类,主要就是通过 @value 注解从配置文件中获取配置项,然后创建 ossclient。
@configurationpublic class ossclientconfig { @value(${aliyun.oss.endpoint}) string endpoint ; @value(${aliyun.oss.accesskeyid}) string accesskeyid ; @value(${aliyun.oss.accesskeysecret}) string accesskeysecret; @bean public ossclient createossclient() { return (ossclient)new ossclientbuilder().build(endpoint, accesskeyid, accesskeysecret); }} 第四步,新增文件上传接口 osscontroller.java,参数为 multipartfile。
@controller@api(tags = 上传)@requestmapping(/osscontroller)public class osscontroller { @autowired private iossservice ossservice; @requestmapping(value = /upload,method=requestmethod.post) @responsebody @apioperation(上传) public resultobject upload(@requestparam(file) multipartfile file, httpservletrequest req) { return resultobject.success(ossservice.upload(file)); }} 第五步,新增 service,将文件上传到 oss,并返回文件保存路径。
@servicepublic class ossserviceimpl implements iossservice{ @value(${aliyun.oss.maxsize}) private int maxsize; @value(${aliyun.oss.bucketname}) private string bucketname; @value(${aliyun.oss.dir.prefix}) private string dirprefix; @autowired private ossclient ossclient; @override public string upload(multipartfile file) { try { return upload(file.getinputstream(), file.getoriginalfilename()); } catch (ioexception e) { logger.error(e.getmessage()); } return null; } @override public string upload(inputstream inputstream,string name) { string objectname = getbucketname(name); // 创建putobject请求。 ossclient.putobject(bucketname, objectname, inputstream); return formatpath(objectname); } private string getbucketname(string url){ string ext = ; for(string extitem:imageextension){ if(url.indexof(extitem) != -1){ ext = extitem; break; } } return dirprefix+ dateutil.today()+/+ idutil.randomuuid()+ext; } private string formatpath(string objectname){ return https:// +bucketname+.+ ossclient.getendpoint().gethost() + / + objectname; }} 第六步,打开 apipost,测试 oss 上传接口,注意参数选择文件,点击发送后可以看到服务器端返回的图片链接。
第七步,进入阿里云 oss 后台管理,可以确认图片确实已经上传成功。
三、拉取前端代码来测试 oss 上传接口 codingmore-admin-web 是编程喵(codingmore)的前端管理项目,可以通过下面的地址拉取到本地。
https://github.com/itwanger/codingmore-admin-web
执行 yarn run dev 命令后就可以启动 web 管理端了,进入到文章编辑页面,选择一张图片进行上传,可以确认图片是可以正常从前端上传到服务器端,服务器端再上传到 oss,之后再返回前端图片访问链接的。
四、利用 oss 进行自动转链 第一步,在 postsserviceimpl.java 中添加图片转链的方法,主要利用正则表达式找出文章内容中的外链,然后将外链的图片上传到 oss,然后再替换掉原来的外链图片。
// 匹配图片的 markdown 语法// // public static final string img_pattern = \!\[.*\]\((.*)\);private void handlecontentimg(posts posts) { string content = posts.getpostcontent(); pattern p = pattern.compile(img_pattern, pattern.case_insensitive); matcher m = p.matcher(content); map map = new hashmap(); while (m.find()) { string imagetag = m.group(); logger.info(使用分组进行替换{}, imagetag); string imageurl = imagetag.substring(imagetag.indexof(() + 1, imagetag.indexof())); // 确认是本站链接,不处理 if (imageurl.indexof(iossservice.getendpoint()) != -1) { continue; } // 通过线程池将图片上传到 oss future future = ossuploadimageexecutor.submit(() -> { return iossservice.upload(imageurl); }); map.put(imageurl, future); } for (string oldurl : map.keyset()) { future future = map.get(oldurl); try { string imageurl = future.get(); content = content.replace(oldurl, imageurl); } catch (interruptedexception | executionexception e) { logger.error(获取图片链接出错{}, e.getmessage()); } } posts.setpostcontent(content);} 第二步,在 ossserviceimpl.java 中添加根据外链地址上传图片到 oss 的方法。
public string upload(string url) { string objectname = getfilename(url); try (inputstream inputstream = new url(url).openstream()) { ossclient.putobject(bucketname, objectname, inputstream); } catch (ioexception e) { logger.error(e.getmessage()); } return formatosspath(objectname);} 第三步,通过 web 管理端来测试外链是否转链成功。先找两张外链的图片,可以看到 markdown 在预览的时候就不显示。
然后我们点击发布,可以看到两张图片都正常显示了,因为转成了 oss 的图片访问地址。
五、小结 综上来看,实习生小二在 spring boot 中整合 oss 的代码还是挺靠谱的,也许 oss+cdn 才是图床的最好解决方案。
需要源码的小伙伴,可以直接到编程喵源码路径拉取:
https://github.com/itwanger/coding-more
鸿蒙操作系统对华未来至关重要 华为宣布10亿美元的“耀星”鼓励计划
飞机制造商ATR预计将在2022年下半年取证之后推出首架ATR 72-600F飞机
5G网络切片的前景现在看的清吗
电动牙刷品牌哪个好,推荐性价比高的电动牙刷
一种使用Mask Transformer进行全景分割的端到端解决方案
在Spring Boot中整合OSS的代码
或非门逻辑符号图
测量新手的LDO线路调整率
远景电动方程式车队在联合国气候变化大会(COP26)上揭幕全新赛车涂装
最适合老年群体穿戴的智能手表
查看已安装磁盘驱动器的简单方法
液晶仪表究竟能给用户带来哪些全新的体验?
纳特通信向您发送一份珠海航展邀请函,敬请查收!
华为助力润和软件打造危化品存储室智能安全管控解决方案
凭借非易失性内存服务MAXQ 处理器-Leveraging
瑞士量子存储元件在微型玻璃室内诞生
谷歌拟11亿美元收购HTC手机代工1月29日全面完成
希捷携手腾讯云发布全球首款集成希捷MACH.2™双磁臂技术的硬盘
改善EMC措施之数字控制抖频
iphone8什时候上市?iphone8最新消息:iPhone8新配色还有A11、LG又重新火了起来!