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

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

    关注

    14

    文章

    10357

    浏览量

    91752
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74376
  • spring
    +关注

    关注

    0

    文章

    341

    浏览量

    16053

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析U-Boot image.c:RK平台镜像处理核心逻辑

    瑞芯微(RK)平台的嵌入式开发,U-Boot作为核心的启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.c正是U-Boot
    的头像 发表于 02-24 16:46 1798次阅读
    深入解析U-<b class='flag-5'>Boot</b> image.c:RK平台镜像处理核心逻辑

    深入解析U-Boot TPL代码:嵌入式启动的“第一棒”背后的秘密

    嵌入式系统启动过程,从按下电源键到操作系统开始运行,中间藏着一系列精密的初始化步骤。今天我们就来拆解 Rockchip 平台 U-Boot 的 TPL(Tiny Program
    的头像 发表于 02-05 14:07 1300次阅读
    深入解析U-<b class='flag-5'>Boot</b> TPL<b class='flag-5'>代码</b>:嵌入式启动的“第一棒”背后的秘密

    MTK平台LK阶段mt_boot.c配置:SELINUX_STATUS 2的作用与影响

    MTK(联发科)平台的 Bootloader(以 LK/Little Kernel 为例),mt_boot.c是负责 Linux 内核启动逻辑的核心文件,此次代码变更(新增#de
    的头像 发表于 02-03 15:46 970次阅读
    MTK平台LK阶段mt_<b class='flag-5'>boot</b>.c配置:SELINUX_STATUS 2的作用与影响

    解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么?

    嵌入式开发,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c
    的头像 发表于 02-03 15:29 951次阅读
    解析Rockchip平台U-<b class='flag-5'>Boot</b>核心文件:<b class='flag-5'>boot</b>_rkimg.c到底做了什么?

    深入解析rk平台Android Bootloader核心代码:从启动流程到AVB验证

    U-BootAndroid Bootloader的核心实现,核心作用是 衔接硬件初始化与内核启动 ,主要负责: •读写Bootloader控制块(BCB),判断设备启动
    的头像 发表于 01-22 07:06 486次阅读
    深入解析rk平台Android Bootloader核心<b class='flag-5'>代码</b>:从启动流程到AVB验证

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

    嵌入式系统,U-Boot 作为引导加载程序,其启动流程的核心环节之一就是 重定位(Relocation) 。对于 RK3506 这类基于 ARM Cortex-A 架构的芯片,重定位的本质是将
    的头像 发表于 11-28 07:05 984次阅读
    深入理解 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 512次阅读
    一款基于Java+<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>+Vue的智慧随访管理系统源码

    极海APM32系列MCU如何把代码重定位到SDRAM运行

    在有些情况下,我们想要把代码放到SDRAM运行。下面介绍APM32的MCU,如何把代码重定位到SDRAM运行。对于不同APM32系列的MCU,方法都是一样的。
    的头像 发表于 11-04 09:14 5392次阅读
    <b class='flag-5'>在</b>极海APM32系列MCU<b class='flag-5'>中</b>如何把<b class='flag-5'>代码</b>重定位到SDRAM运行

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

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

    NVIDIA从云到边缘加速OpenAI gpt-oss模型部署,实现150万TPS推理

      自 2016 年推出 NVIDIA DGX 以来,NVIDIA 与 OpenAI 便开始共同推动 AI 技术的边界。此次 OpenAI gpt-oss-20b 和 gpt-oss-120b 模型
    的头像 发表于 08-15 20:34 2495次阅读
    NVIDIA从云到边缘加速OpenAI gpt-<b class='flag-5'>oss</b>模型部署,实现150万TPS推理

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

    Spring框架,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring We
    的头像 发表于 07-26 11:25 797次阅读
    <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次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-uboot启动流程分析之boot ROM阶段

    CPU上电之后执行的第一段代码并不是uboot代码,因为uboot存储启动介质(存储介质),如eMMC Flash、NAND Flash、SD卡,CPU想要执行启动介质的uboot
    发表于 05-28 10:01

    飞凌嵌入式ElfBoard ELF 1板卡-uboot编译u-boot/u-boot.bin/u-boot.imx

    u-boot文件就是编译流程章节讲的,链接器将链接各.o文件之后生成的.elf文件,该文件包含了大量的调试信息、地址信息和注释信息,不能被直接执行,需要转换成为可执行的u-boot.bin文件,而
    发表于 05-22 11:24