在Spring Boot中整合OSS的代码

小二是新来的实习生,作为技术 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 语法// ![](hhhx.png)// ![xx](hhhx.png?ax)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又重新火了起来!