0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Spring Boot中整合OSS的代码

Q4MP_gh_c472c21 来源:沉默王二 作者:沉默王二 2022-04-24 09:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就不能搞个对象存储服务,比如说 OSS、MinIO?

他理直气壮地反驳道:“谁让你不讲清楚,我去找老板把你开掉!”我瞬间就怂了,说,“来来来,我手把手教你怎么把图片保存到 OSS 上,好不好?”

“不用了,还是我来教你吧。”小二非常自信,下面是他在 Spring Boot 应用中整合 OSS 做的记录。

一、开通 OSS

OSS 也就是 Object Storage Service,是阿里云提供的一套对象存储服务,国内的竞品还有七牛云的 Kodo和腾讯云的COS。

第一步,登录阿里云官网,搜索“OSS”关键字,进入 OSS 产品页。

第二步,如果是 OSS 新用户的话,可以享受 6 个月的新人专享优惠价,不过续费的时候还是会肉疼。

第三步,进入 OSS 管理控制台,点击「Bucket 列表」,点击「创建 Bucket」。

5be9c328-c2f5-11ec-bce3-dac502259ad0.png

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。

@Configuration
publicclassOssClientConfig{
@Value("${aliyun.oss.endpoint}")
Stringendpoint;
@Value("${aliyun.oss.accessKeyId}")
StringaccessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
StringaccessKeySecret;

@Bean
publicOSSClientcreateOssClient(){
return(OSSClient)newOSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
}
}

第四步,新增文件上传接口 OssController.java,参数为 MultipartFile。

@Controller
@Api(tags="上传")
@RequestMapping("/ossController")
publicclassOssController{
@Autowired
privateIOssServiceossService;

@RequestMapping(value="/upload",method=RequestMethod.POST)
@ResponseBody
@ApiOperation("上传")
publicResultObjectupload(@RequestParam("file")MultipartFilefile,HttpServletRequestreq){
returnResultObject.success(ossService.upload(file));
}
}

第五步,新增 Service,将文件上传到 OSS,并返回文件保存路径。

@Service
publicclassOssServiceImplimplementsIOssService{

@Value("${aliyun.oss.maxSize}")
privateintmaxSize;

@Value("${aliyun.oss.bucketName}")
privateStringbucketName;

@Value("${aliyun.oss.dir.prefix}")
privateStringdirPrefix;

@Autowired
privateOSSClientossClient;
@Override
publicStringupload(MultipartFilefile){
try{
returnupload(file.getInputStream(),file.getOriginalFilename());
}catch(IOExceptione){
LOGGER.error(e.getMessage());
}
returnnull;
}

@Override
publicStringupload(InputStreaminputStream,Stringname){
StringobjectName=getBucketName(name);
//创建PutObject请求。
ossClient.putObject(bucketName,objectName,inputStream);
returnformatPath(objectName);
}
privateStringgetBucketName(Stringurl){
Stringext="";
for(StringextItem:imageExtension){
if(url.indexOf(extItem)!=-1){
ext=extItem;
break;
}
}
returndirPrefix+DateUtil.today()+"/"+IdUtil.randomUUID()+ext;
}

privateStringformatPath(StringobjectName){
return"https://"+bucketName+"."+ossClient.getEndpoint().getHost()+"/"+objectName;
}
}

第六步,打开 Apipost,测试 OSS 上传接口,注意参数选择文件,点击发送后可以看到服务器端返回的图片链接。

5c01e5d4-c2f5-11ec-bce3-dac502259ad0.png

第七步,进入阿里云 OSS 后台管理,可以确认图片确实已经上传成功。

三、拉取前端代码来测试 OSS 上传接口

codingmore-admin-web 是编程喵(Codingmore)的前端管理项目,可以通过下面的地址拉取到本地。

https://github.com/itwanger/codingmore-admin-web

执行 yarn run dev 命令后就可以启动 Web 管理端了,进入到文章编辑页面,选择一张图片进行上传,可以确认图片是可以正常从前端上传到服务器端,服务器端再上传到 OSS,之后再返回前端图片访问链接的。

5c35d768-c2f5-11ec-bce3-dac502259ad0.png

四、利用 OSS 进行自动转链

第一步,在 PostsServiceImpl.java 中添加图片转链的方法,主要利用正则表达式找出文章内容中的外链,然后将外链的图片上传到 OSS,然后再替换掉原来的外链图片。

//匹配图片的markdown语法
//![](hhhx.png)
//![xx](hhhx.png?ax)
publicstaticfinalStringIMG_PATTERN="\!\[.*\]\((.*)\)";

privatevoidhandleContentImg(Postsposts){
Stringcontent=posts.getPostContent();

Patternp=Pattern.compile(IMG_PATTERN,Pattern.CASE_INSENSITIVE);
Matcherm=p.matcher(content);

Map>map=newHashMap<>();

while(m.find()){
StringimageTag=m.group();
LOGGER.info("使用分组进行替换{}",imageTag);

StringimageUrl=imageTag.substring(imageTag.indexOf("(")+1,imageTag.indexOf(")"));

//确认是本站链接,不处理
if(imageUrl.indexOf(iOssService.getEndPoint())!=-1){
continue;
}

//通过线程池将图片上传到OSS
Futurefuture=ossUploadImageExecutor.submit(()->{
returniOssService.upload(imageUrl);
});
map.put(imageUrl,future);
}

for(StringoldUrl:map.keySet()){
Futurefuture=map.get(oldUrl);

try{
StringimageUrl=future.get();
content=content.replace(oldUrl,imageUrl);
}catch(InterruptedException|ExecutionExceptione){
LOGGER.error("获取图片链接出错{}",e.getMessage());
}

}
posts.setPostContent(content);
}

第二步,在 OssServiceImpl.java 中添加根据外链地址上传图片到 OSS 的方法。

publicStringupload(Stringurl){
StringobjectName=getFileName(url);
try(InputStreaminputStream=newURL(url).openStream()){
ossClient.putObject(bucketName,objectName,inputStream);
}catch(IOExceptione){
LOGGER.error(e.getMessage());
}
returnformatOSSPath(objectName);
}

第三步,通过 Web 管理端来测试外链是否转链成功。先找两张外链的图片,可以看到 markdown 在预览的时候就不显示。

5c510984-c2f5-11ec-bce3-dac502259ad0.png

然后我们点击发布,可以看到两张图片都正常显示了,因为转成了 OSS 的图片访问地址。

5c68c286-c2f5-11ec-bce3-dac502259ad0.png

五、小结

综上来看,实习生小二在 Spring Boot 中整合 OSS 的代码还是挺靠谱的,也许 OSS+CDN 才是图床的最好解决方案。

需要源码的小伙伴,可以直接到编程喵源码路径拉取:

https://github.com/itwanger/coding-more

END 审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10097

    浏览量

    90907
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73165
  • spring
    +关注

    关注

    0

    文章

    341

    浏览量

    15782

原文标题:崩溃!实习生竟然把图片直接存到了服务器上…

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入理解 RK3506 U-Boot 重定位:从代码到原理

    嵌入式系统,U-Boot 作为引导加载程序,其启动流程的核心环节之一就是 重定位(Relocation) 。对于 RK3506 这类基于 ARM Cortex-A 架构的芯片,重定位的本质是将
    的头像 发表于 11-28 07:05 140次阅读
    深入理解 RK3506 U-<b class='flag-5'>Boot</b> 重定位:从<b class='flag-5'>代码</b>到原理

    一款基于Java+Spring Boot+Vue的智慧随访管理系统源码

    智慧随访管理系统源码,一款基于Java+Spring Boot+Vue的B/S架构医院随访管理系统源码,采用前后端分离技术(Ant-Design+MySQL5),具有自主版权和落地案例。 随访管理
    的头像 发表于 11-13 15:38 198次阅读
    一款基于Java+<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>+Vue的智慧随访管理系统源码

    为什么Config0/1 Boot Select 设置 Keil ICE 调试模式下无效呢?

    ICE 调试模式下,代码将在 Flash Select 字段(APROM 或 LDROM)选择的区域中进行编程,并从该区域启动,而不是从 Config0/1 Boot Sel
    发表于 08-20 06:27

    Spring拦截器:你的请求休想逃过我的五指山!

    Spring框架,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring We
    的头像 发表于 07-26 11:25 522次阅读
    <b class='flag-5'>Spring</b>拦截器:你的请求休想逃过我的五指山!

    请问EZ-Serial固件是否使用任何OSS(开源软件)库或软件?

    EZ-Serial 固件是否使用任何 OSS(开源软件)库或软件?
    发表于 07-02 08:14

    爱立信推出革命性OSS/BSS产品组合

    爱立信近日推出革命性OSS/BSS产品组合,赋能运营商AI意图驱动及自智网络时代实现全方位创新突破!告别传统模式,拥抱敏捷、智能服务的新时代。
    的头像 发表于 06-24 15:13 1.6w次阅读

    瑞萨RZT2H CR52双核BOOT流程和例程代码分析

    以双CR52 Core为例,说明了T2H多核系统的BOOT流程。
    的头像 发表于 04-02 09:28 1740次阅读
    瑞萨RZT2H CR52双核<b class='flag-5'>BOOT</b>流程和例程<b class='flag-5'>代码</b>分析

    S32K142为什么无法计算出正确的BOOT_MAC?

    我使用安全启动功能,想在修改代码后手动更新 BOOT_MAC。 我 AN5401 的示例代码(4_secure_
    发表于 04-02 06:07

    通过Boot swap实现瑞萨RL78/F24 MCU固件升级

    本文主要说明如何使用已有的程序更新flash的固件。使用这种方法代码闪存分为两个区域:执行区域和临时区域。瑞萨flash驱动程序RL78 RFD Type02用于对flash进行重新编程并执行boot swapping。本次说
    的头像 发表于 02-26 09:25 2201次阅读
    通过<b class='flag-5'>Boot</b> swap实现瑞萨RL78/F24 MCU固件升级

    OSS Nokalva:适用于Python的OSS NAS工具

    执行以下任务:编写软件来创建、处理、调试和测试 NAS 消息。处理 3GPP 版本的更改时,此任务特别耗时且容易出错。现在客户可以专注于他们的核心业务。 用于 Python 的 OSS NAS 工具
    的头像 发表于 02-09 09:16 781次阅读
    <b class='flag-5'>OSS</b> Nokalva:适用于Python的<b class='flag-5'>OSS</b> NAS工具

    校园点餐订餐外卖跑腿Java源码

    创建一个校园点餐订餐外卖跑腿系统是一个复杂的项目,涉及到前端、后端、数据库设计等多个方面。在这里,我可以提供一个简化的Java后端示例,使用Spring Boot框架来搭建一个基本的API服务。这个
    的头像 发表于 12-24 14:55 935次阅读
    校园点餐订餐外卖跑腿Java源码

    SSM与Hibernate的整合使用

    作为Java持久化框架的代表,常被整合到SSM框架。 SSM框架简介 SSM框架是指Spring、SpringMVC和MyBatis三个框架的整合使用。
    的头像 发表于 12-17 09:14 996次阅读

    SSM开发环境的搭建教程 SSM与Spring Boot的区别

    件是Web项目的核心配置文件。 webapp 目录下创建一个 index.jsp 文件作为项目的首页。 配置 pom.xml 文件 : pom.xml 文件添加SSM框架所需的依
    的头像 发表于 12-16 18:13 1826次阅读

    SSM框架在Java开发的应用 如何使用SSM进行web开发

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web开发中常用的技术栈。它通过分层架构,实现了视图、控制、业务逻辑和数据访问的分离,提高了代码的可维护性和可扩展性
    的头像 发表于 12-16 17:28 2157次阅读

    Spring 应用合并之路(二):峰回路转,柳暗花明

    提醒下,决定抛开 Spring Boot 内置的父子容器方案,完全自己实现父子容器。 如何加载 web 项目? 现在的难题只有一个:如何加载 web 项目?加载完成后,如何持续持有 web 项目?经过思考后,可以创建一个 boot
    的头像 发表于 12-12 11:22 1423次阅读