若依框架集成阿里云OSS實現文件上傳優化

背景介紹

在若依框架目前的實現中,是把圖片存儲到了服務器本地的目錄,通過服務進行訪問,這樣做存儲的是比較省事,但是缺點也有很多:

  • 硬件與網絡要求:服務器通常需要高性能的硬件和穩定的網絡環境,以保證文件傳輸的效率和穩定性。這可能會增加硬件和網絡資源的成本和維護難度。
  • 管理難度:服務器目錄需要管理員進行配置和管理,包括權限設置、備份策略等。如果管理不善或配置不當,可能會引發一些安全問題和性能問題。
  • 性能瓶頸:如果服務器處理能力不足或網絡帶寬不夠,可能會導致性能瓶頸,影響文件上傳、下載和訪問的速度。
  • 單點故障風險:服務器故障可能導致所有存儲在其上的文件無法訪問,盡管可以通過備份和冗余措施來降低這種風險,但單點故障的風險仍然存在。

基于以上原因,企業中很多的文件都會存儲到OSS中,OSS可以解決以上所有的問題,并且成本也不高,下面我就把阿里的OSS集成到若依項目中(MinIO 存儲應該同樣可以試用)

依賴配置

在項目的pom.xml文件中添加必要的依賴:

<properties><aliyun.sdk.oss>3.10.2</aliyun.sdk.oss><lombok.version>1.18.22</lombok.version>
</properties><!-- 依賴聲明 -->
<dependencyManagement><dependencies><!-- 其他依賴省略... --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun.sdk.oss}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies>
</dependencyManagement>

技術實現

改造目標

主要是要對controller.common.CommonController.uploadFile下的@PostMapping("/upload") public AjaxResult uploadFile(MultipartFile file)來進行改造。

1. 文件存儲服務類

創建OSS文件存儲服務,封裝上傳和刪除操作:

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.zzyl.oss.properties.AliOssConfigProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;@Slf4j
@Component
public class OSSAliyunFileStorageService {@AutowiredOSS ossClient;@AutowiredAliOssConfigProperties aliOssConfigProperties;/*** 上傳文件* @param objectName  文件名* @param inputStream  文件流對象* @return*/public String store(String objectName, InputStream inputStream) {//文件讀取路徑String url = null;// 判斷文件if (inputStream == null) {log.error("上傳文件:objectName{}文件流為空", objectName);return url;}log.info("OSS文件上傳開始:{}", objectName);try {String bucketName = aliOssConfigProperties.getBucketName();// 上傳文件PutObjectRequest request = new PutObjectRequest(bucketName, objectName, inputStream);PutObjectResult result = ossClient.putObject(request);// 設置權限(公開讀)ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);if (result != null) {log.info("OSS文件上傳成功:{}", objectName);}} catch (OSSException oe) {log.error("OSS文件上傳錯誤:{}", oe);} catch (ClientException ce) {log.error("OSS文件上傳客戶端錯誤:{}", ce);}//文件訪問路徑規則 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(aliOssConfigProperties.getBucketName()).append(".").append(aliOssConfigProperties.getEndpoint()).append("/").append(objectName);return stringBuilder.toString();}/*** 根據url刪除文件* @param pathUrl   url地址(全路徑)*/public void delete(String pathUrl) {String prefix = "https://"+aliOssConfigProperties.getBucketName()+"."+ aliOssConfigProperties.getEndpoint()+"/";String key = pathUrl.replace(prefix, "");List<String> keys = new ArrayList<>();keys.add(key);// 刪除ObjectsossClient.deleteObjects(new DeleteObjectsRequest(aliOssConfigProperties.getBucketName()).withKeys(keys));}}

2. OSS客戶端配置類

創建OSS客戶端的自動配置,實現客戶端初始化和存儲桶管理:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.SetBucketLoggingRequest;
import com.zzyl.oss.properties.AliOssConfigProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class OssAliyunAutoConfig {@AutowiredAliOssConfigProperties aliOssConfigProperties;@Beanpublic OSS ossClient(){log.info("-----------------開始創建OSSClient--------------------");OSS ossClient = new OSSClientBuilder().build(aliOssConfigProperties.getEndpoint(),aliOssConfigProperties.getAccessKeyId(), aliOssConfigProperties.getAccessKeySecret());//判斷容器是否存在,不存在就創建if (!ossClient.doesBucketExist(aliOssConfigProperties.getBucketName())) {ossClient.createBucket(aliOssConfigProperties.getBucketName());CreateBucketRequest createBucketRequest = new CreateBucketRequest(aliOssConfigProperties.getBucketName());//設置問公共可讀createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);ossClient.createBucket(createBucketRequest);}//添加客戶端訪問日志SetBucketLoggingRequest request = new SetBucketLoggingRequest(aliOssConfigProperties.getBucketName());// 設置存放日志文件的存儲空間。request.setTargetBucket(aliOssConfigProperties.getBucketName());// 設置日志文件存放的目錄。request.setTargetPrefix(aliOssConfigProperties.getBucketName());ossClient.setBucketLogging(request);log.info("-----------------結束創建OSSClient--------------------");return ossClient;}}

3. 配置屬性類

創建OSS配置屬性類,用于管理阿里云OSS的連接參數:

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** @ClassName AliOssConfigProperties.java* */
@Setter
@Getter
@NoArgsConstructor
@ToString
@Configuration
@ConfigurationProperties(prefix = "oss")
public class AliOssConfigProperties {/*** 域名站點*/private String endpoint ;/*** 秘鑰Id*/private String accessKeyId ;/*** 秘鑰*/private String accessKeySecret ;/*** 桶名稱*/private String bucketName ;}

應用配置

application.yml中添加OSS相關配置:

oss:endpoint: oss-cn-hangzhou.aliyuncs.comaccessKeyId: your-access-key-idaccessKeySecret: your-access-key-secretbucketName: your-bucket-name

控制器改造

在原有的CommonController中注入OSS服務,并修改uploadFile方法:

@Autowired
private OSSAliyunFileStorageService ossFileStorageService;@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) {try {// 生成唯一文件名String objectName = generateObjectName(file.getOriginalFilename());// 上傳到OSSString url = ossFileStorageService.store(objectName, file.getInputStream());return AjaxResult.success().put("url", url);} catch (Exception e) {return AjaxResult.error("上傳失敗");}
}

測試使用

測試圖片


OSS作為分布式對象存儲服務,提供了高可用、高擴展性的文件存儲解決方案,能夠有效解決傳統本地存儲在硬件成本、管理復雜度、性能瓶頸和單點故障等方面的問題,特別適合企業級應用的文件存儲需求。

如果文章對你有幫助,不妨點個贊!謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88739.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mac如何連接惠普M126a打印機(教程篇)

這里寫自定義目錄標題Mac如何連接惠普M126a打印機&#xff08;教程篇&#xff09;教程配置如下&#xff1a;Mac如何連接惠普M126a打印機&#xff08;教程篇&#xff09; 惠普M126a連接Mac&#xff08;教程篇&#xff09; 教程配置如下&#xff1a; 首先&#xff0c;先獲取與HP打…

感恩日記:記錄生活中的美好時刻

感恩日記的landing page登錄注冊填寫感恩事項私信可以體驗一下

一扇門鈴,萬向感應——用 eventfd 實現零延遲通信

&#x1f50d; 本篇概要 eventfd 是 Linux 提供的一種輕量級事件通知機制。你可以把它想象成一個“計數器盒子”。它里面維護的是一個64位的計數器。寫入&#xff1a;往盒子里放一些數字&#xff08;比如 1、5、10&#xff09;&#xff0c;表示有幾件事發生了。讀取&#xff1a…

基于Node.js的線上教學系統的設計與實現(源碼+論文+調試+安裝+售后)

感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;我會一一回復&#xff0c;希望幫助更多的人。系統背景近年來&#xff0c;全球數字化浪潮的推進與教育公平化需求的增長&#xff0c;促使線上教學迎…

互斥鎖詳解(操作系統os)

1. 互斥鎖 (Mutex) - 檔案室的“智能鎖”首先&#xff0c;我們給之前討論的那些“鎖”一個正式的名字&#xff1a;互斥鎖 (Mutex)。概念&#xff1a;你可以把它簡單理解成檔案室門上的一把“智能鎖”。它只有兩種狀態&#xff1a;locked (已上鎖) 或 unlocked (未上鎖)。操作&a…

自動潤滑系統:從 “盲目養護“ 到智能精注的工業運維革命

?在工業運維的漫長歷史中&#xff0c;傳統潤滑模式如同"定時喂飯"——無論設備實際需求&#xff0c;僅憑經驗或固定周期執行潤滑作業。這種模式埋下兩大隱患&#xff1a;過度潤滑&#xff1a;某汽車生產線曾因季度性強制潤滑&#xff0c;每年浪費1.2噸潤滑脂&#x…

【Java八股文總結 — 包學會】(二)計算機網絡

1.一條url輸入到瀏覽器最后顯示頁面的過程 URL解析與處理 瀏覽器解析URL&#xff08;如https://www.example.com/page&#xff09; 分離協議&#xff08;https&#xff09;、域名&#xff08;www.example.com&#xff09;和資源路徑&#xff08;/page&#xff09; 檢查HSTS預加…

力扣61.旋轉鏈表

給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5], k 2 輸出&#xff1a;[4,5,1,2,3]示例 2&#xff1a;輸入&#xff1a;head [0,1,2], k 4 輸出&#xff1a;[2,0,1]提示…

深度剖析:std::vector 內存機制與 push_back 擴容策略

深度剖析&#xff1a;std::vector 內存機制與 push_back 擴容策略 1. std::vector 核心內部結構 #mermaid-svg-8HOj3MqsD6UVgEeA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8HOj3MqsD6UVgEeA .error-icon{fill:…

GROW領導力模型

GROW領導力模型是由英國教練格雷厄姆亞歷山大&#xff08;Graham Alexander&#xff09;、艾倫Fine和約翰惠特默&#xff08;John Whitmore&#xff09;在20世紀80年代提出的&#xff0c;最初用于體育教練領域&#xff0c;后來被廣泛應用于企業管理、領導力發展和個人成長中。它…

打破并發瓶頸:虛擬線程實現詳解與傳統線程模型的性能對比

目錄 一、定義與特性 二、虛擬線程實現 2.1 使用 Thread.startVirtualThread() 創建 2.2 使用 Thread.ofVirtual() 創建 2.3 使用 ThreadFactory 創建 2.4 使用 Executors.newVirtualThreadPerTaskExecutor()創建 三、虛擬線程和普通線程的區別 3.1 線程管理方式不同 3…

“28項評測23項SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B級視覺語言模型的性能天花板!

一、模型介紹 GLM-4.1V-9B-Thinking是由智譜AI聯合清華大學團隊推出的多模態大模型&#xff0c;以GLM-4-9B-0414基座模型為底&#xff0c;通過引入“思維鏈推理機制”和“課程采樣強化學習策略”&#xff08;Reinforcement Learning with Curriculum Sampling&#xff09;&…

推薦系統-Random算法

Random算法總結引言 在推薦系統研究與應用中&#xff0c;我們常常需要一些簡單的基線算法來衡量更復雜算法的性能提升。Random&#xff08;隨機推薦&#xff09;算法是最基礎的基線方法之一&#xff0c;它通過隨機生成評分來模擬用戶對物品的偏好。雖然這種方法看似簡單&#x…

Django--02模型和管理站點

Django–02模型與站點管理 Part 2: Models and the admin site 本教程承接Django–01的內容。我們將設置數據庫、創建你的第一個模型&#xff0c;并快速了解 Django 自動生成的管理站點。 文章目錄Django--02模型與站點管理前言一、設置數據庫1.1 參考文檔鏈接1.2 默認設置1.3…

CS課程項目設計1:交互友好的井字棋游戲

最近突然想開設一個專欄了&#xff0c;專門為計算機專業的同行分享一些入門級的課程項目設計&#xff0c;旨在讓同學更好地了解CS項目的設計流程&#xff0c;同時給出代碼來介紹coding過程。 今天要分享的是第一個CS課程項目&#xff1a;交互友好的井字棋游戲。 1. 研究目的 井…

首個自動駕駛VLA綜述介紹

當視覺(Vision)、語言(Language)和行動(Action)三大能力在一個模型中融合,自動駕駛的未來將走向何方? 近日,來自麥吉爾大學、清華大學、小米公司和威斯康辛麥迪遜的研究團隊聯合發布了全球首篇針對自動駕駛領域的視覺-語言-行動(Vision-Language-Action, VLA)模型的…

C# 接口(接口可以繼承接口)

接口可以繼承接口 之前我們已經知道接口實現可以從基類被繼承&#xff0c;而接口本身也可以從一個或多個接口繼承而來。要指定某個接口繼承其他的接口&#xff0c;應在接口聲明中把基接口名稱以逗號分隔的列表形式 放在接口名稱后面的冒號之后&#xff0c;如下所示。類在基類列…

linux----------------------線程同步與互斥(上)

1.線程互斥 1-1 進程線程間的互斥相關背景概念 臨界資源&#xff1a;多線程執行流共享的資源就叫做臨界資源 臨界區&#xff1a;每個線程內部訪問臨界資源的代碼就叫做臨界區 互斥&#xff1a;任何時刻&#xff0c;互斥保證只有一個執行進入臨界區&#xff0c;對臨界資源起…

百度AI的開放新篇章:文心4.5本地化部署指南與未來生態戰略展望

百度AI的開放新篇章&#xff1a;文心4.5本地化部署指南與未來生態戰略展望 一起來玩轉文心大模型吧&#x1f449;文心大模型免費下載地址&#xff1a;https://ai.gitcode.com/theme/1939325484087291906 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30…

筆記/sklearn中的數據劃分方法

文章目錄一、前言二、數據劃分方法1. 留出法&#xff08;Hold-out&#xff09;2. K折交叉驗證&#xff08;K-Fold&#xff09;3. 留一法&#xff08;Leave-One-Out&#xff09;三、總結一、前言 簡要介紹數據劃分在機器學習中的作用。 二、數據劃分方法 1. 留出法&#xff0…