91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

在Spring Boot中整合OSS的代碼

Q4MP_gh_c472c21 ? 來(lái)源:沉默王二 ? 作者:沉默王二 ? 2022-04-24 09:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

“不用了,還是我來(lái)教你吧。”小二非常自信,下面是他在 Spring Boot 應(yīng)用中整合 OSS 做的記錄。

一、開(kāi)通 OSS

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

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

第二步,如果是 OSS 新用戶(hù)的話(huà),可以享受 6 個(gè)月的新人專(zhuān)享優(yōu)惠價(jià),不過(guò)續(xù)費(fèi)的時(shí)候還是會(huì)肉疼。

第三步,進(jìn)入 OSS 管理控制臺(tái),點(diǎn)擊「Bucket 列表」,點(diǎn)擊「創(chuàng)建 Bucket」。

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

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

第四步,點(diǎn)擊「確定」就算是開(kāi)通成功了。

二、整合 OSS

第一步,在 pom.xml 文件中添加 OSS 的依賴(lài)。



com.aliyun.oss
aliyun-sdk-oss
3.10.2

第二步,在 application.yml 文件中添加 OSS 配置項(xiàng)。

aliyun:
oss:
#oss對(duì)外服務(wù)的訪(fǎng)問(wèn)域名
endpoint:oss-cn-beijing.aliyuncs.com
#訪(fǎng)問(wèn)身份驗(yàn)證中用到用戶(hù)標(biāo)識(shí)
accessKeyId:LTAI5
#用戶(hù)用于加密簽名字符串和oss用來(lái)驗(yàn)證簽名字符串的密鑰
accessKeySecret:RYN
#oss的存儲(chǔ)空間
bucketName:itwanger-oss1
#上傳文件大小(M)
maxSize:3
#上傳文件夾路徑前綴
dir:
prefix:codingmore/images/

第三步,新增 OssClientConfig.java 配置類(lèi),主要就是通過(guò) @Value 注解從配置文件中獲取配置項(xiàng),然后創(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請(qǐng)求。
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;
}
}

第六步,打開(kāi) Apipost,測(cè)試 OSS 上傳接口,注意參數(shù)選擇文件,點(diǎn)擊發(fā)送后可以看到服務(wù)器端返回的圖片鏈接。

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

第七步,進(jìn)入阿里云 OSS 后臺(tái)管理,可以確認(rèn)圖片確實(shí)已經(jīng)上傳成功。

三、拉取前端代碼來(lái)測(cè)試 OSS 上傳接口

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

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

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

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

四、利用 OSS 進(jìn)行自動(dòng)轉(zhuǎn)鏈

第一步,在 PostsServiceImpl.java 中添加圖片轉(zhuǎn)鏈的方法,主要利用正則表達(dá)式找出文章內(nèi)容中的外鏈,然后將外鏈的圖片上傳到 OSS,然后再替換掉原來(lái)的外鏈圖片。

//匹配圖片的markdown語(yǔ)法
//![](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("使用分組進(jìn)行替換{}",imageTag);

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

//確認(rèn)是本站鏈接,不處理
if(imageUrl.indexOf(iOssService.getEndPoint())!=-1){
continue;
}

//通過(guò)線(xiàn)程池將圖片上傳到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("獲取圖片鏈接出錯(cuò){}",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);
}

第三步,通過(guò) Web 管理端來(lái)測(cè)試外鏈?zhǔn)欠褶D(zhuǎn)鏈成功。先找兩張外鏈的圖片,可以看到 markdown 在預(yù)覽的時(shí)候就不顯示。

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

然后我們點(diǎn)擊發(fā)布,可以看到兩張圖片都正常顯示了,因?yàn)檗D(zhuǎn)成了 OSS 的圖片訪(fǎng)問(wèn)地址。

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

五、小結(jié)

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

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

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

END 審核編輯 :李倩

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

    關(guān)注

    14

    文章

    10272

    瀏覽量

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

    關(guān)注

    30

    文章

    4971

    瀏覽量

    74037
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    15957

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入解析U-Boot TPL代碼:嵌入式啟動(dòng)的“第一棒”背后的秘密

    嵌入式系統(tǒng)啟動(dòng)過(guò)程,從按下電源鍵到操作系統(tǒng)開(kāi)始運(yùn)行,中間藏著一系列精密的初始化步驟。今天我們就來(lái)拆解 Rockchip 平臺(tái) U-Boot 的 TPL(Tiny Program
    的頭像 發(fā)表于 02-05 14:07 ?1108次閱讀
    深入解析U-<b class='flag-5'>Boot</b> TPL<b class='flag-5'>代碼</b>:嵌入式啟動(dòng)的“第一棒”背后的秘密

    MTK平臺(tái)LK階段mt_boot.c配置:SELINUX_STATUS 2的作用與影響

    MTK(聯(lián)發(fā)科)平臺(tái)的 Bootloader(以 LK/Little Kernel 為例),mt_boot.c是負(fù)責(zé) Linux 內(nèi)核啟動(dòng)邏輯的核心文件,此次代碼變更(新增#de
    的頭像 發(fā)表于 02-03 15:46 ?829次閱讀
    MTK平臺(tái)LK階段mt_<b class='flag-5'>boot</b>.c配置:SELINUX_STATUS 2的作用與影響

    解析Rockchip平臺(tái)U-Boot核心文件:boot_rkimg.c到底做了什么?

    嵌入式開(kāi)發(fā),U-Boot 作為引導(dǎo)程序的 “中流砥柱”,負(fù)責(zé)初始化硬件、加載內(nèi)核并啟動(dòng)系統(tǒng)。對(duì)于 Rockchip 平臺(tái)的設(shè)備(如常見(jiàn)的開(kāi)發(fā)板、智能終端),boot_rkimg.c
    的頭像 發(fā)表于 02-03 15:29 ?779次閱讀
    解析Rockchip平臺(tái)U-<b class='flag-5'>Boot</b>核心文件:<b class='flag-5'>boot</b>_rkimg.c到底做了什么?

    深入解析rk平臺(tái)Android Bootloader核心代碼:從啟動(dòng)流程到AVB驗(yàn)證

    U-BootAndroid Bootloader的核心實(shí)現(xiàn),核心作用是 銜接硬件初始化與內(nèi)核啟動(dòng) ,主要負(fù)責(zé): ?讀寫(xiě)B(tài)ootloader控制塊(BCB),判斷設(shè)備啟動(dòng)
    的頭像 發(fā)表于 01-22 07:06 ?305次閱讀
    深入解析rk平臺(tái)Android Bootloader核心<b class='flag-5'>代碼</b>:從啟動(dòng)流程到AVB驗(yàn)證

    深入理解?RK3506 U-Boot?重定位:從代碼到原理

    嵌入式系統(tǒng),U-Boot?作為引導(dǎo)加載程序,其啟動(dòng)流程的核心環(huán)節(jié)之一就是 重定位(Relocation) 。對(duì)于?RK3506?這類(lèi)基于?ARM Cortex-A?架構(gòu)的芯片,重定位的本質(zhì)是將
    的頭像 發(fā)表于 11-28 07:05 ?660次閱讀
    深入理解?RK3506 U-<b class='flag-5'>Boot</b>?重定位:從<b class='flag-5'>代碼</b>到原理

    一款基于Java+Spring Boot+Vue的智慧隨訪(fǎng)管理系統(tǒng)源碼

    智慧隨訪(fǎng)管理系統(tǒng)源碼,一款基于Java+Spring Boot+Vue的B/S架構(gòu)醫(yī)院隨訪(fǎng)管理系統(tǒng)源碼,采用前后端分離技術(shù)(Ant-Design+MySQL5),具有自主版權(quán)和落地案例。 隨訪(fǎng)管理
    的頭像 發(fā)表于 11-13 15:38 ?415次閱讀
    一款基于Java+<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>+Vue的智慧隨訪(fǎng)管理系統(tǒng)源碼

    為什么Config0/1 Boot Select 設(shè)置 Keil ICE 調(diào)試模式下無(wú)效呢?

    ICE 調(diào)試模式下,代碼將在 Flash Select 字段(APROM 或 LDROM)選擇的區(qū)域中進(jìn)行編程,并從該區(qū)域啟動(dòng),而不是從 Config0/1 Boot Sel
    發(fā)表于 08-20 06:27

    Spring攔截器:你的請(qǐng)求休想逃過(guò)我的五指山!

    Spring框架,攔截器(Interceptor)是一種強(qiáng)大的機(jī)制,它允許開(kāi)發(fā)者在請(qǐng)求處理的不同階段插入自定義邏輯。WebApplicationContext作為Spring We
    的頭像 發(fā)表于 07-26 11:25 ?713次閱讀
    <b class='flag-5'>Spring</b>攔截器:你的請(qǐng)求休想逃過(guò)我的五指山!

    請(qǐng)問(wèn)EZ-Serial固件是否使用任何OSS(開(kāi)源軟件)庫(kù)或軟件?

    EZ-Serial 固件是否使用任何 OSS(開(kāi)源軟件)庫(kù)或軟件?
    發(fā)表于 07-02 08:14

    愛(ài)立信推出革命性OSS/BSS產(chǎn)品組合

    愛(ài)立信近日推出革命性OSS/BSS產(chǎn)品組合,賦能運(yùn)營(yíng)商AI意圖驅(qū)動(dòng)及自智網(wǎng)絡(luò)時(shí)代實(shí)現(xiàn)全方位創(chuàng)新突破!告別傳統(tǒng)模式,擁抱敏捷、智能服務(wù)的新時(shí)代。
    的頭像 發(fā)表于 06-24 15:13 ?1.6w次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-uboot啟動(dòng)流程分析之boot ROM階段

    CPU上電之后執(zhí)行的第一段代碼并不是uboot代碼,因?yàn)閡boot存儲(chǔ)啟動(dòng)介質(zhì)(存儲(chǔ)介質(zhì)),如eMMC Flash、NAND Flash、SD卡,CPU想要執(zhí)行啟動(dòng)介質(zhì)的uboot
    發(fā)表于 05-28 10:01

    飛凌嵌入式ElfBoard ELF 1板卡-uboot編譯u-boot/u-boot.bin/u-boot.imx

    u-boot文件就是編譯流程章節(jié)講的,鏈接器將鏈接各.o文件之后生成的.elf文件,該文件包含了大量的調(diào)試信息、地址信息和注釋信息,不能被直接執(zhí)行,需要轉(zhuǎn)換成為可執(zhí)行的u-boot.bin文件,而
    發(fā)表于 05-22 11:24

    瑞薩RZT2H CR52雙核BOOT流程和例程代碼分析

    以雙CR52 Core為例,說(shuō)明了T2H多核系統(tǒng)的BOOT流程。
    的頭像 發(fā)表于 04-02 09:28 ?2265次閱讀
    瑞薩RZT2H CR52雙核<b class='flag-5'>BOOT</b>流程和例程<b class='flag-5'>代碼</b>分析

    S32K142為什么無(wú)法計(jì)算出正確的BOOT_MAC?

    我使用安全啟動(dòng)功能,想在修改代碼后手動(dòng)更新 BOOT_MAC。 我 AN5401 的示例代碼(4_secure_
    發(fā)表于 04-02 06:07

    i.MX RT 1176上正常運(yùn)行代碼時(shí)與使用IAR調(diào)試代碼時(shí)存在一些奇怪的差異,為什么?

    ,并且調(diào)試時(shí)一切都按預(yù)期工作,但我發(fā)現(xiàn)當(dāng)處理器正常啟動(dòng)時(shí),它根本不使用重置向量的 SP 值,而是將其設(shè)置為(大約)0x20241d80。 我的理解是,i.MX RT 1176 BO
    發(fā)表于 03-17 07:26