保姆級SpringBoot+Vue圖片上傳到阿裡雲OSS教程

来源:https://www.cnblogs.com/qing-gee/archive/2022/03/22/16039410.html
-Advertisement-
Play Games

小二是新來的實習生,作為技術 leader,我給他安排了一個非常簡單的練手任務,把前端 markdown 編輯器里上傳的圖片保存到伺服器端,結果他真的就把圖片直接保存到了伺服器上,這下可把我氣壞了,就不能搞個對象存儲服務,比如說 OSS、MinIO? 他理直氣壯地反駁道:“誰讓你不講清楚,我去找老闆 ...


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

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

“不用了,還是我來教你吧。”小二非常自信,下麵是他在 Spring Boot 應用中整合 OSS 做的記錄。

特此聲明:阿裡雲 OSS 的產品負責人看到後請自覺過來結算下推廣費用(狗頭)。真心講:Spring Boot+OSS 在實際開發中挺常見的。

一、開通 OSS

OSS 也就是 Object Storage Service,是阿裡雲提供的一套對象存儲服務,國內的競品還有七牛雲的 Kodo和騰訊雲的COS。

第一步,登錄阿裡雲官網,搜索“OSS”關鍵字,進入 OSS 產品頁。

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

第三步,進入 OSS 管理控制台,點擊「Bucket 列表」,點擊「創建 Bucket」。

Bucket 的詞面意思是桶,這裡指存儲空間,就是用於存儲對象的容器。註意讀寫許可權為“公共讀”,也就是允許互聯網用戶訪問雲空間上的圖片。

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

二、整合 OSS

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

<!-- 阿裡雲 OSS --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency>

第二步,在 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 public class OssClientConfig { @Value("${aliyun.oss.endpoint}") String endpoint ; @Value("${aliyun.oss.accessKeyId}") String accessKeyId ; @Value("${aliyun.oss.accessKeySecret}") String accessKeySecret; @Bean public OSSClient createOssClient() { return (OSSClient)new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); } }

第四步,新增文件上傳介面 OssController.java,參數為 MultipartFile。

@Controller @Api(tags = "上傳") @RequestMapping("/ossController") public class OssController { @Autowired private IOssService ossService; @RequestMapping(value = "/upload",method=RequestMethod.POST) @ResponseBody @ApiOperation("上傳") public ResultObject<String> upload(@RequestParam("file") MultipartFile file, HttpServletRequest req) { return ResultObject.success(ossService.upload(file)); } }

第五步,新增 Service,將文件上傳到 OSS,並返迴文件保存路徑。

@Service public class OssServiceImpl implements IOssService{ @Value("${aliyun.oss.maxSize}") private int maxSize; @Value("${aliyun.oss.bucketName}") private String bucketName; @Value("${aliyun.oss.dir.prefix}") private String dirPrefix; @Autowired private OSSClient ossClient; @Override public String upload(MultipartFile file) { try { return upload(file.getInputStream(), file.getOriginalFilename()); } catch (IOException e) { LOGGER.error(e.getMessage()); } return null; } @Override public String upload(InputStream inputStream,String name) { String objectName = getBucketName(name); // 創建PutObject請求。 ossClient.putObject(bucketName, objectName, inputStream); return formatPath(objectName); } private String getBucketName(String url){ String ext = ""; for(String extItem:imageExtension){ if(url.indexOf(extItem) != -1){ ext = extItem; break; } } return dirPrefix+ DateUtil.today()+"/"+ IdUtil.randomUUID()+ext; } private String formatPath(String objectName){ return "https://" +bucketName+"."+ ossClient.getEndpoint().getHost() + "/" + objectName; } }

第六步,打開 Apipost,測試 OSS 上傳介面,註意參數選擇文件,點擊發送後可以看到伺服器端返回的圖片鏈接。

第七步,進入阿裡雲 OSS 後臺管理,可以確認圖片確實已經上傳成功。

三、拉取前端代碼來測試 OSS 上傳介面

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

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

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

四、利用 OSS 進行自動轉鏈

第一步,在 PostsServiceImpl.java 中添加圖片轉鏈的方法,主要利用正則表達式找出文章內容中的外鏈,然後將外鏈的圖片上傳到 OSS,然後再替換掉原來的外鏈圖片。

// 匹配圖片的 markdown 語法 // ![](hhhx.png) // ![xx](hhhx.png?ax) public static final String IMG_PATTERN = "\\!\\[.*\\]\\((.*)\\)"; private void handleContentImg(Posts posts) { String content = posts.getPostContent(); Pattern p = Pattern.compile(IMG_PATTERN, Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(content); Map<String, Future<String>> map = new HashMap<>(); while (m.find()) { String imageTag = m.group(); LOGGER.info("使用分組進行替換{}", imageTag); String imageUrl = imageTag.substring(imageTag.indexOf("(") + 1, imageTag.indexOf(")")); // 確認是本站鏈接,不處理 if (imageUrl.indexOf(iOssService.getEndPoint()) != -1) { continue; } // 通過線程池將圖片上傳到 OSS Future<String> future = ossUploadImageExecutor.submit(() -> { return iOssService.upload(imageUrl); }); map.put(imageUrl, future); } for (String oldUrl : map.keySet()) { Future<String> future = map.get(oldUrl); try { String imageUrl = future.get(); content = content.replace(oldUrl, imageUrl); } catch (InterruptedException | ExecutionException e) { LOGGER.error("獲取圖片鏈接出錯{}", e.getMessage()); } } posts.setPostContent(content); }

第二步,在 OssServiceImpl.java 中添加根據外鏈地址上傳圖片到 OSS 的方法。

public String upload(String url) { String objectName = getFileName(url); try (InputStream inputStream = new URL(url).openStream()) { ossClient.putObject(bucketName, objectName, inputStream); } catch (IOException e) { LOGGER.error(e.getMessage()); } return formatOSSPath(objectName); }

第三步,通過 Web 管理端來測試外鏈是否轉鏈成功。先找兩張外鏈的圖片,可以看到 markdown 在預覽的時候就不顯示。

然後我們點擊發佈,可以看到兩張圖片都正常顯示了,因為轉成了 OSS 的圖片訪問地址。

五、小結

綜上來看,實習生小二在 Spring Boot 中整合 OSS 的代碼還是挺靠譜的。也許 OSS+CDN 才是圖床的最好解決方案,不過阿裡雲的 HTTPS CDN 在 GitHub 上無法回源導致圖片不顯示的問題仍然沒有得到有效的解決。

需要源碼的小伙伴可以直接到編程喵

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡化版設計之初就是為了從當前頁作用域對象讀取數據並輸出,所以從 request,session,application 讀取數據並輸出時應該避免使用簡化版EL表達式 ...
  • Java面向對象 初識面向對象 面向過程 & 面向對象 面向過程思想 步驟清晰簡單,第一步做什麼,第二部做什麼... 面對過程適合處理一些較為簡單的問題 面向對象思想 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程思索 ...
  • 本文通過一個python的實際案例的設計,來講解python面向對象的技術——類的繼承中必用的super函數的邏輯。其實我們可以把python中類的繼承理解成這樣的一個過程:當我們在括弧中明確了父類時,其實已經引用了父類的成員函數,但是並沒有執行父類的初始化函數。在執行子類的初始化函數的同時,會檢查... ...
  • 疫情太嚴重了,有很多小伙伴都不能出門玩耍了。給大家看一個特別的風景吧,Python煙花代碼,雖然沒有現實中的煙花那麼美麗,但是在特殊時期足矣安慰自己了。 先給大家看一下效果圖 代碼如下 #####需要Python資料的加Q群:906715085###### -*- coding: utf-8 -*- ...
  • 前言 本文將解決以下問題: 如何將Linux下任意位置的項目(虛擬目錄)部署到tomcat? 如何將項目部署到伺服器特定埠? 如何在一個伺服器上部署多個web應用? 本例中 系統:Linux version 3.10.0-514.el7.x86_64、tomcat版本:8.0.30.0、jdk 版 ...
  • 在使用 Python 列表時, 出現了修改其中一個列表, 其他列表聯動改變這個情況, 在查閱文檔後, 寫在這裡記錄一下. 出現這個情況的原因是因為我使用了 a = b 這個賦值語句, 我下意識的認為 a, b 是兩個不同的對象, 其實在 Python 一切都是對象, 所謂的變數, 只是指向一個對象的 ...
  • 今天這篇博客也是學習springboot做的學習筆記,關於springboot集成redis,分享給有需要的小伙伴們,視頻看的動力節點 動力節點王鶴老師講解的springboot教程,由淺入深,帶你體驗Spring Boot的極速開發過程,內容豐富,涵蓋了SpringBoot開發的方方面面,並且同步 ...
  • 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就添加一個"javaee"元素,請寫代碼實現。 1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...