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 审核编辑 :李倩

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

    关注

    12

    文章

    9237

    浏览量

    85663
  • 代码
    +关注

    关注

    30

    文章

    4803

    浏览量

    68750
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14358

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    SSM与Hibernate的整合使用

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

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

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

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

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

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

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

    如何在Petalinux下Patch u-boot源码

    软件开发过程我们经常遇到用 Patch 来传递和更新代码的场景。本文以一个端到端的例子来演示 Petalinux 使用过程,如何给
    的头像 发表于 12-04 16:26 1087次阅读
    如何在Petalinux下Patch u-<b class='flag-5'>boot</b>源码

    Spring事务实现原理

    这些操作。 spring事务有编程式事务和声明式事务两种实现方式。编程式事务是通过编写代码来管理事务的提交、回滚、以及事务的边界。这意味着开发者需要在代码显式地调用事务的开始、提交和
    的头像 发表于 11-08 10:10 845次阅读
    <b class='flag-5'>Spring</b>事务实现原理

    Spring Cloud Gateway网关框架

    Spring Cloud Gateway网关框架 本软件微服务架构采用Spring Cloud Gateway网关控制框架,Spring Cloud Gateway是
    的头像 发表于 08-22 09:58 513次阅读
    <b class='flag-5'>Spring</b> Cloud Gateway网关框架

    单片机boot0和boot1怎么设置

    单片机Boot0和Boot1简介 Boot0和Boot1是单片机启动模式选择引脚,用于选择单片机的启动模式。 Boot0和
    的头像 发表于 08-22 09:50 2793次阅读

    stm32读取boot引脚状态

    STM32微控制器Boot引脚(通常指的是BOOT0和BOOT1引脚)的状态决定了设备启动时的引导模式。这些引脚的状态
    的头像 发表于 08-22 09:48 1459次阅读

    stm32boot0和boot1对应哪个p引脚

    STM32系列微控制器是一种广泛应用于嵌入式系统领域的32位微控制器。STM32系列微控制器BOOT0和BOOT1是两个重要的引脚,它们用于设置设备的启动模式。 首先,让我们了解
    的头像 发表于 08-22 09:40 3360次阅读

    vue+spring boot人员定位系统源码,实现实时定位、智慧调度、轨迹追踪

    、机具、物料上定位标签回传的位置信息数据,采用多维定位模式,精确定位人、机具、物料的实时位置,实现实时定位、物料标签配置、智慧调度、轨迹追踪、工时统计、区域物料统计、电子围栏等应用功能。 技术架构:java+ spring boot+ v
    的头像 发表于 08-08 14:27 783次阅读
    vue+<b class='flag-5'>spring</b> <b class='flag-5'>boot</b>人员定位系统源码,实现实时定位、智慧调度、轨迹追踪

    玩转Spring状态机

    说起Spring状态机,大家很容易联想到这个状态机和设计模式状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,介绍Sprin
    的头像 发表于 06-25 14:21 976次阅读
    玩转<b class='flag-5'>Spring</b>状态机

    极空间上线“阿里云对象存储OSS挂载”功能

    虽然与阿里云盘关联密切,但值得注意的是,阿里云对象存储 OSS 实质上是以对象形式存储于 OSS 存储空间内的内容。用户若想使用 OSS,首先须创建 Bucket,详设定 Bucket 的地域、访问权限以及存储类型等要素。
    的头像 发表于 04-03 11:20 702次阅读

    SpingBoot的5个扩展点,超级实用!

    我们启动Spring Boot项目的时候,是执行这样一个方法来启动的
    的头像 发表于 02-22 11:28 488次阅读
    SpingBoot的5个扩展点,超级实用!