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

    文章

    9038

    浏览量

    85229
  • 代码
    +关注

    关注

    30

    文章

    4758

    浏览量

    68392
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14319

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

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

收藏 人收藏

    评论

    相关推荐

    Spring事务实现原理

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

    Spring Cloud Gateway网关框架

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

    使用Spring Boot 3.2虚拟线程搭建静态文件服务器

    Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能。
    的头像 发表于 01-09 09:34 1089次阅读
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 3.2虚拟线程搭建静态文件服务器

    stm32boot0和boot1怎么接

    STM32微控制器BOOT0和BOOT1是用于控制启动模式和引导加载程序的引脚。启动模式决定了从哪个存储器中加载程序执行,而引导加载程序是一段特殊的
    的头像 发表于 12-27 10:22 1.7w次阅读

    Spring状态机的实现原理和使用方法

    说起 Spring 状态机,大家很容易联想到这个状态机和设计模式状态模式的区别是啥呢?没错,Spring 状态机就是状态模式的一种实现,介绍 S
    的头像 发表于 12-26 09:39 1892次阅读
    <b class='flag-5'>Spring</b>状态机的实现原理和使用方法

    【飞腾派4G版免费试用】Spring Boot和飞腾派融合构建的农业物联网系统-个人中心篇

    本帖最后由 sda12138 于 2023-12-18 19:44 编辑 接上集 本次实验主要完成Spring Boot和飞腾派融合构建的农业物联网系统-个人中心篇,本次实验主要完成共两部分
    发表于 12-18 15:26

    Spring事务失效的十种常见场景

    Spring的声明式事务功能更是提供了极其方便的事务配置方式,配合Spring Boot的自动配置,大多数Spring Boot项目只需要在
    的头像 发表于 12-11 15:03 874次阅读

    【飞腾派4G版免费试用】Spring Boot和飞腾派融合构建的农业物联网系统-环境搭建篇

    ntpdate-u 120.25.108.11) 7.安装MySQL服务器(sudo apt install mysql -server) 遇到问题: 1测试中板子TF卡处发热较为严重。 下期更新: Spring Boot和飞腾派融合构建的农业物联网系统-实现篇1
    发表于 12-11 15:00

    u-boot汇编启动阶段的相关操作介绍

    u-boot汇编启动阶段对系统的一些初始化 当cpu交由u-boot接管进入u-boot后, 首先会到_start符号处开始执行初始化, 并在此期间完成一些必要的系统寄存器相关的初始
    的头像 发表于 12-07 11:22 588次阅读

    redis容器部署并用编程演示sb整合

    Redis,并通过编程演示 Spring Boot 如何整合 Redis。 Redis 容器部署 Redis 可以通过容器部署,我们可以使用 Docker 来创建 Redis 容器。以下是
    的头像 发表于 12-05 10:08 388次阅读

    dubbo和spring cloud区别

    Dubbo和Spring Cloud是两个非常流行的微服务框架,各有自己的特点和优势。本文中,我们将详细介绍Dubbo和Spring Cloud的区别。 1.架构设计: Dubbo是阿里巴巴开源
    的头像 发表于 12-04 14:47 1630次阅读

    如何在Spring Boot应用程序整合ZXing库

    在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序整合ZXing库,
    的头像 发表于 12-03 17:39 1067次阅读

    springboot的优点与缺点

    看看。 优点: 简化配置:Spring Boot使用约定优于配置的原则,自动配置应用程序的大部分组件。使用默认配置,开发人员可以立即开始编写代码,而无需手动配置各种Spring组件。
    的头像 发表于 12-03 15:29 1450次阅读

    springboot自动配置的原理介绍

    Boot的设计理念,尽量使开发者能够集中精力于业务逻辑的实现,而不是纠结于框架的配置。Spring Boot通过自动配置的机制,大幅减轻了应用程序开发的工作量。下面将详细介绍
    的头像 发表于 12-03 15:12 904次阅读

    Spring依赖注入的四种方式

    Spring框架,依赖注入是一种核心的概念和机制。通过依赖注入,我们可以让对象之间的依赖关系更加松散,并且能够方便地进行单元测试和模块化开发。
    的头像 发表于 12-03 15:11 1924次阅读