0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在Spring Boot中整合OSS的代碼

Q4MP_gh_c472c21 ? 來源:沉默王二 ? 作者:沉默王二 ? 2022-04-24 09:45 ? 次閱讀

小二是新來的實習(xí)生,作為技術(shù) leader,我給他安排了一個非常簡單的練手任務(wù),把前端 markdown 編輯器里上傳的圖片保存到服務(wù)器端,結(jié)果他真的就把圖片直接保存到了服務(wù)器上,這下可把我氣壞了,就不能搞個對象存儲服務(wù),比如說 OSS、MinIO?

他理直氣壯地反駁道:“誰讓你不講清楚,我去找老板把你開掉!”我瞬間就慫了,說,“來來來,我手把手教你怎么把圖片保存到 OSS 上,好不好?”

“不用了,還是我來教你吧?!毙《浅W孕?,下面是他在 Spring Boot 應(yīng)用中整合 OSS 做的記錄。

一、開通 OSS

OSS 也就是 Object Storage Service,是阿里云提供的一套對象存儲服務(wù),國內(nèi)的競品還有七牛云的 Kodo和騰訊云的COS。

第一步,登錄阿里云官網(wǎng),搜索“OSS”關(guān)鍵字,進入 OSS 產(chǎn)品頁。

第二步,如果是 OSS 新用戶的話,可以享受 6 個月的新人專享優(yōu)惠價,不過續(xù)費的時候還是會肉疼。

第三步,進入 OSS 管理控制臺,點擊「Bucket 列表」,點擊「創(chuàng)建 Bucket」。

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

Bucket 的詞面意思是桶,這里指存儲空間,就是用于存儲對象的容器。注意讀寫權(quán)限為“公共讀”,也就是允許互聯(lián)網(wǎng)用戶訪問云空間上的圖片。

第四步,點擊「確定」就算是開通成功了。

二、整合 OSS

第一步,在 pom.xml 文件中添加 OSS 的依賴。



com.aliyun.oss
aliyun-sdk-oss
3.10.2

第二步,在 application.yml 文件中添加 OSS 配置項。

aliyun:
oss:
#oss對外服務(wù)的訪問域名
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 注解從配置文件中獲取配置項,然后創(chuàng)建 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,參數(shù)為 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);
//創(chuàng)建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 上傳接口,注意參數(shù)選擇文件,點擊發(fā)送后可以看到服務(wù)器端返回的圖片鏈接。

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

第七步,進入阿里云 OSS 后臺管理,可以確認圖片確實已經(jīng)上傳成功。

三、拉取前端代碼來測試 OSS 上傳接口

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

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

執(zhí)行 yarn run dev 命令后就可以啟動 Web 管理端了,進入到文章編輯頁面,選擇一張圖片進行上傳,可以確認圖片是可以正常從前端上傳到服務(wù)器端,服務(wù)器端再上傳到 OSS,之后再返回前端圖片訪問鏈接的。

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

四、利用 OSS 進行自動轉(zhuǎn)鏈

第一步,在 PostsServiceImpl.java 中添加圖片轉(zhuǎn)鏈的方法,主要利用正則表達式找出文章內(nèi)容中的外鏈,然后將外鏈的圖片上傳到 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 中添加根據(jù)外鏈地址上傳圖片到 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 管理端來測試外鏈是否轉(zhuǎn)鏈成功。先找兩張外鏈的圖片,可以看到 markdown 在預(yù)覽的時候就不顯示。

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

然后我們點擊發(fā)布,可以看到兩張圖片都正常顯示了,因為轉(zhuǎn)成了 OSS 的圖片訪問地址。

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

五、小結(jié)

綜上來看,實習(xí)生小二在 Spring Boot 中整合 OSS 的代碼還是挺靠譜的,也許 OSS+CDN 才是圖床的最好解決方案。

需要源碼的小伙伴,可以直接到編程喵源碼路徑拉?。?/p>

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

END 審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8701

    瀏覽量

    84553
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67770
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14259

原文標題:崩潰!實習(xí)生竟然把圖片直接存到了服務(wù)器上…

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Spring Cloud Gateway網(wǎng)關(guān)框架

    Spring Cloud Gateway網(wǎng)關(guān)框架 本軟件微服務(wù)架構(gòu)采用Spring Cloud Gateway網(wǎng)關(guān)控制框架,Spring Cloud Gateway是
    的頭像 發(fā)表于 08-22 09:58 ?288次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關(guān)框架

    如何在Spring Boot應(yīng)用程序整合ZXing庫

    在數(shù)字化時代,二維碼已經(jīng)成為了信息交流的一種常見方式。它們被廣泛用于各種應(yīng)用,從產(chǎn)品標簽到活動傳單,以及電子支付。本文將向您展示如何在Spring Boot應(yīng)用程序整合ZXing庫,
    的頭像 發(fā)表于 12-03 17:39 ?967次閱讀

    Spring Boot 3.2支持虛擬線程和原生鏡像

    Spring Boot 3.2 前幾日發(fā)布,讓我們用 Java 21、GraalVM 和虛擬線程來嘗試一下。
    的頭像 發(fā)表于 11-30 16:22 ?584次閱讀

    Spring布能用來搭建基礎(chǔ)架構(gòu)嗎

    Spring Boot 是一個用于簡化 Spring 應(yīng)用程序開發(fā)的框架,它利用 Spring 框架的強大功能,使得基礎(chǔ)架構(gòu)的搭建變得更加簡單、輕量級、易于維護。
    的頭像 發(fā)表于 11-16 10:56 ?317次閱讀

    Spring Boot 的設(shè)計目標

    什么是Spring Boot Spring BootSpring 開源組織下的一個子項目,也是 S
    的頭像 發(fā)表于 10-13 14:56 ?488次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計目標

    Spring Boot的啟動原理

    可能很多初學(xué)者會比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴打包成一個獨立的 Jar 包,因為傳統(tǒng)的 Java 項目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?542次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot啟動 Eureka流程

    在上篇已經(jīng)說過了 Eureka-Server 本質(zhì)上是一個 web 應(yīng)用的項目,今天就來看看 Spring Boot 是怎么啟動 Eureka 的。 Spring
    的頭像 發(fā)表于 10-10 11:40 ?709次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot Actuator快速入門

    不知道大家Spring Boot 項目的過程,使用過 Spring Boot Actua
    的頭像 發(fā)表于 10-09 17:11 ?528次閱讀

    Spring Boot時配置JSON序列化選項的幾種方法

    Spring Boot Web 項目中,當使用JSON格式接收數(shù)據(jù)和返回數(shù)據(jù)的時候,Spring Boot 默認使用一個ObjectMap
    的頭像 發(fā)表于 10-09 10:26 ?1820次閱讀

    Spring Boot配置加載相關(guān)知識

    Spring BOOT 啟動參數(shù) Java Web的開發(fā)完成后,以前我們都會打包成war文件,然后放大web容器,比如tomcat、jetty這樣的容器?,F(xiàn)在基于SpringBoot開發(fā)的項目
    的頭像 發(fā)表于 10-07 15:47 ?394次閱讀

    Spring Boot如何實現(xiàn)異步任務(wù)

    Spring Boot 提供了多種方式來實現(xiàn)異步任務(wù),這里介紹三種主要實現(xiàn)方式。 1、基于注解 @Async @Async 注解是 Spring 提供的一種輕量級異步方法實現(xiàn)方式,它可以標記在方法上
    的頭像 發(fā)表于 09-30 10:32 ?1136次閱讀

    Gradle構(gòu)建的多模塊Spring Boot項目

    構(gòu)建的多模塊 Spring Boot 項目,JDK 版本為8,IDEA 版本為 2022.3.1 。 1. 創(chuàng)建項目 打開IDEA,選擇菜單:File -> New -> Project,在其
    的頭像 發(fā)表于 09-25 14:46 ?2464次閱讀
    Gradle構(gòu)建的多模塊<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>項目

    Spring Boot Starter需要些什么

    pulsar-spring-boot-starter是非常有必要的,在此之前,我們先看看一個starter需要些什么。 Spring Boot Starter spring-boot
    的頭像 發(fā)表于 09-25 11:35 ?633次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> Starter需要些什么

    kafka client spring如何實現(xiàn)

    認識了 spring-boot-starter ,今天不妨來看下如何寫一個 pulsar-spring-boot-starter 模塊。 目標 寫一個完整的類似 kafka-spring-boot-st
    的頭像 發(fā)表于 09-25 11:21 ?399次閱讀
    kafka client<b class='flag-5'>在</b> <b class='flag-5'>spring</b>如何實現(xiàn)

    Spring Boot虛擬線程和Webflux性能對比

    早上看到一篇關(guān)于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內(nèi)容較長,抓重點給大家介紹一下這篇文章的核心內(nèi)容,方便大家快速閱讀。
    發(fā)表于 09-24 14:54 ?753次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>虛擬線程和Webflux性能對比