Minio搭建并在SpringBoot中使用完成用戶頭像的上傳

Minio使用搭建并上傳用戶頭像到服務器操作,學習筆記

Minio介紹

minio官網

  • MinIO是一個開源的分布式對象存儲服務器,支持S3協議并且可以在多節點上實現數據的高可用和容錯。它采用Go語言開發,擁有輕量級、高性能、易部署等特點,并且可以自由選擇底層存儲介質。

  • MinIO的主要特點包括:

1、高性能:MinIO基于GO語言編寫,具有高速、輕量級、高并發等性能特點,還支持多線程和緩存等機制進行優化,可以快速地處理大規模數據。

2、可擴展性:MinIO采用分布式存儲模式,支持水平擴展,通過增加節點數量來擴展存儲容量和性能,支持自動數據遷移和負載均衡。

3、安全性:MinIO提供了多種安全策略,如訪問控制列表(ACL)、服務端加密(SSE)、傳輸層安全性(TLS)等,可以保障數據安全和隱私。

4、兼容性:MinIO兼容AWS S3 API,還支持其他云服務提供商的API,比如GCP、Azure等,可以通過簡單的配置實現互操作性。

5、簡單易用:MinIO的部署和管理非常簡單,只需要運行一個二進制包即可啟動服務,同時提供了Web界面和命令行工具等方便的管理工具。

  • S3協議是Amazon Web Services (AWS) 提供的對象存儲服務(Simple Storage Service)的API協議。它是一種 RESTful風格的Web服務接口,使用HTTP/HTTPS協議進行通信,支持多種編程語言和操作系統,并實現了數據的可靠存儲、高擴展性以及良好的可用性。

Minio安裝 (linux+docker)

//拉取鏡像
docker pull quay.io/minio/minio// 創建數據存儲目錄
mkdir -p ~/minio/data// 創建minio
docker run -p 9001:9000 -p 9090:9090 --name minio --restart=always -v ~/minio/data:/data -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=yourpassword." -d quay.io/minio/minio server /data --console-address ":9090"
  • 參數解析
  1. docker run 運行容器

    啟動一個新的 Docker 容器,如果鏡像不存在,會自動拉取。

  2. -p 9001:9000 -p 9090:9090(端口映射)
    ? -p 9001:9000
    ? 將容器內部的 9000 端口 映射到 宿主機的 9001 端口,9000 是 MinIO 的 API 訪問端口。
    ? 這意味著你可以通過 http://localhost:9001 訪問 MinIO 的 API。
    ? -p 9090:9090
    ? 將 容器內部的 9090 端口 映射到 宿主機的 9090 端口,9090 是 MinIO 的 Web 管理控制臺端口。
    ? 你可以通過 http://localhost:9090 訪問 MinIO 的管理界面。

  3. –name minio(容器名稱)
    ? --name minio 給該容器命名為 minio,這樣之后可以通過 docker stop minio / docker start minio 來管理它,而不需要使用容器 ID。

  4. –restart=always(自動重啟)
    ? --restart=always 讓容器 始終自動重啟,包括:
    ? Docker 進程重啟后,容器也會自動重啟。
    ? 容器異常退出時,Docker 也會自動重啟它。
    ? 但如果你 手動停止容器 (docker stop minio),它不會重啟。

  5. -v ~/minio/data:/data(數據持久化)
    ? -v ~/minio/data:/data 掛載數據卷,把 宿主機 ~/minio/data 目錄映射到 容器內 /data 目錄:
    ? 這樣 MinIO 存儲的數據不會隨著容器刪除而丟失。
    ? ~/minio/data 目錄存儲 MinIO 內部的對象數據。

  6. -e “MINIO_ROOT_USER=admin”(環境變量)
    ? -e 傳遞環境變量,設置 MinIO 的 管理員用戶名 為 admin。

  7. -e “MINIO_ROOT_PASSWORD=yourpassword.”(環境變量)
    ? 設定 MinIO 管理員密碼 為 自己設置.。

  8. -d quay.io/minio/minio(后臺運行 & 指定鏡像)
    ? -d 讓容器 后臺運行(detach mode)。
    ? quay.io/minio/minio 指定 MinIO 官方鏡像(托管在 quay.io,類似于 docker.io)。

  9. server /data --console-address “:9090”(啟動 MinIO 服務器)
    ? server /data 指定 MinIO 使用 /data 目錄 作為存儲路徑(前面 -v ~/minio/data:/data 綁定的目錄)。
    ? --console-address “:9090” 設置 MinIO Web 管理控制臺 監聽 9090 端口。

登錄并創建桶

1、登錄

在這里插入圖片描述

2、創建桶

在這里插入圖片描述
在這里插入圖片描述

3、設置權限

在這里插入圖片描述
在這里插入圖片描述

在springBoot中使用 后端

1、導入坐標
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version>
</dependency>
2、controller
@RestController
@RequestMapping("/admin/system")
public class FileUploadController {@Autowiredprivate FileUploadService fileUploadService;@PostMapping("/upload")//MultipartFile file 這個名字要和前端的name對應上. 我用的是element plus 默認的名字就是filepublic Result<String> fileUpload(MultipartFile file){//最后返回的是文件minio文件預覽的瀏覽器的路徑, 給前端作回顯用// 見下面的我標紅的圖像String fileUrl=fileUploadService.fileUpload(file);return Result.build(fileUrl, ResultCodeEnum.SUCCESS);}
}
  • 返回的fileUrl 就是我標紅的路徑, 就是文件上傳到的真實地方,方便前端作回顯示
    在這里插入圖片描述
  • 如果你用的不是Element plus 作上傳, 記得名字要匹配了. 這里都是屬于SpringMVC的知識 , 變量的名字都一樣不要 @RequestParm 注解也行
<form id="uploadForm"><input type="file" name="file"> <!-- 這里的 name="file" 要和 @RequestParam("file") 一致 --><button type="button" onclick="uploadFile()">上傳</button>
</form>
3、service
@Service
public class FileUploadServiceImpl implements FileUploadService {//使用配置文件的方式讀,minio的配置, 不硬編碼@Autowiredprivate MinioProperties minioProperties;@Overridepublic String fileUpload(MultipartFile file) {String fileUrl= null;try {MinioClient  minioClient =MinioClient.builder().endpoint(minioProperties.getEndpointUrl())  // MinIO 服務器地址.credentials(minioProperties.getAccessKey(), //  賬號minioProperties.getSecureKey()) //密碼.build();// 不存在桶就創建boolean found =minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build());
//                不能用下滑線連接,拼接訪問路徑會出錯if (!found) {// 創建minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());}//創建日期文件夾//DataUtil 來自Hutool工具類庫String path = DateUtil.format(new Date(), "yyyyMMdd");//生成隨機文件名String uuid = UUID.randomUUID().toString().replaceAll("-", "");String fileName=path+'/'+uuid+file.getOriginalFilename();minioClient.putObject(PutObjectArgs.builder().bucket(minioProperties.getBucketName())  //桶名稱.object(fileName)  //文件名// 采用的是已經知道文件大小的讀     -1 表示 不限制分塊大小(自動選擇最佳方式).stream(file.getInputStream(), file.getSize(), -1)//設置 文件的 MIME 類型)//讓 MinIO 知道如何處理和預覽這個文件。.contentType(file.getContentType()).build());//手動拼接url,給前端,方便前端作回顯示fileUrl = minioProperties.getEndpointUrl()+"/"+minioProperties.getBucketName()+'/'+fileName;} catch (Exception e) {e.printStackTrace();}//我們是在新增用戶的時候給用戶添加頭像的,你給前端訪問路徑了, 前端會映射到頭像(avator這個字段上), 一點擊新增用戶,直接就把這個url帶到mysql中了, 所有這里就不用寫mapper了return fileUrl;}
}
  • 其中 用到DataUtil工具類,需要導入hutool
<!--        生成驗證碼 ,日期時間等--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency>
4、 配置文件內容

在配置文件中添加Minio的相關配置

# 自定義配置
spzx:minio:# 別用https,如果你沒有申請過ssl證書,就http就可以# 用戶名和密碼都是 在docker構建 minio的時候設置的endpointUrl: http://服務器ip:9000      accessKey: 你的用戶名secreKey: 你設置的密碼bucketName: 給桶起個名字
5、 MinioProperties讀配置文件

將構建MinioClient所對應的參數定義到配置文件中,然后通過該實體類封裝該配置文件中的內容.

@Data // 需要提供get方法
@ConfigurationProperties(prefix = "spzx.minio")
public class MinioProperties {
//和yml聲明的屬性保持一致private String endpointUrl;  // minio的urlprivate String accessKey;  //賬號private String secureKey;// 密碼private String bucketName; //桶的名字
}
  • 記得在啟動類中 加上@EnableConfigurationProperties
@SpringBootApplication
@ComponentScan(basePackages = {"com.chen"})
// 讓spring能掃到我們自己寫的配置類
@EnableConfigurationProperties(value = {MinioProperties.class})
public class SpzxManagerApplication {public static void main(String[] args) {SpringApplication.run(SpzxManagerApplication.class,args);}
}

前端 vue

<template><el-form-item label="頭像"><!--         element plus     默認上傳的name就是file, 和你controller啟的名字對應上 --><el-uploadclass="avatar-uploader"action="http://localhost:8501/admin/system/upload":show-file-list="false":headers="headers":on-success="loadSuccess"><img v-if="sysUser.avatar" :src="sysUser.avatar" class="avatar"/><el-icon v-else class="avatar-uploader-icon"><Plus/></el-icon></el-upload></el-form-item>
</template>	      
//定義用戶數據模型
const defaultSysUserForm = {id: '',userName: "",password: "",name: "",phone: "",avatar: "",   // 操作用戶的頭像description: ""
}
const sysUser = ref(defaultSysUserForm)
//上傳成功的回調函數
const loadSuccess = (response) => {//這里response 就是我們后端封裝的 result對象//給響應式對象復制//loadSuccess(response) 是上傳成功的回調函數// response.data 包含上傳成功后的文件 URL(即頭像地址)。// 這樣 sysUser.value.avatar 就能保存 新頭像的 URL,從而在前端顯示最新上傳的頭像。sysUser.value.avatar = response.data
}

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

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

相關文章

vue3中ref和reactive響應式數據、ref模板引用(組合式和選項式區別)、組件ref的使用

目錄 Ⅰ.ref 1.基本用法&#xff1a;ref響應式數據 2.ref模板引用 3.ref在v-for中的模板引用 ?4.ref在組件上使用 ?5.TS中ref數據標注類型 Ⅱ.reactive 1.基本用法&#xff1a;reactive響應式數據 2.TS中reactive標注類型 Ⅲ.ref和reactive的使用場景和區別 Ⅳ.小結…

javascript實現雪花飄落效果

本文實現雪花飄落效果的 JavaScript 網頁設計案例&#xff0c;代碼實現如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, init…

項目準備(flask+pyhon+MachineLearning)- 3

目錄 1.商品信息 2. 商品銷售預測 2.1 機器學習 2.2 預測功能 3. 模型評估 1.商品信息 app.route(/products) def products():"""商品分析頁面"""data load_data()# 計算當前期間和上期間current_period data[data[成交時間] > data[成…

FPGA開發,使用Deepseek V3還是R1(3):系統級與RTL級

以下都是Deepseek生成的答案 FPGA開發&#xff0c;使用Deepseek V3還是R1&#xff08;1&#xff09;&#xff1a;應用場景 FPGA開發&#xff0c;使用Deepseek V3還是R1&#xff08;2&#xff09;&#xff1a;V3和R1的區別 FPGA開發&#xff0c;使用Deepseek V3還是R1&#x…

實現 Leaflet 多類型點位標記與聚合功能的實戰經驗分享

在現代的地理信息系統&#xff08;GIS&#xff09;應用中&#xff0c;地圖功能是不可或缺的一部分。無論是展示商業網點、旅游景點還是公共服務設施&#xff0c;地圖都能以直觀的方式呈現數據。然而&#xff0c;當數據量較大時&#xff0c;地圖上可能會出現大量的標記點&#x…

企微審批中MySQL字段TEXT類型被截斷的排查與修復實踐

在MySQL中&#xff0c;TEXT類型字段常用于存儲較大的文本數據&#xff0c;但在一些應用場景中&#xff0c;當文本內容較大時&#xff0c;TEXT類型字段可能無法滿足需求&#xff0c;導致數據截斷或插入失敗。為了避免這種問題&#xff0c;了解不同文本類型&#xff08;如TEXT、M…

【常見BUG】Spring Boot 和 Springfox(Swagger)版本兼容問題

???歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學習,不斷總結,共同進步,活到老學到老…

HTTP 協議的發展歷程:從 HTTP/1.0 到 HTTP/2.0

HTTP 協議的發展歷程&#xff1a;從 HTTP/1.0 到 HTTP/2.0 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是 Web 的基礎協議&#xff0c;用于客戶端和服務器之間的通信。從 HTTP/1.0 到 HTTP/2.0&#xff0c;HTTP 協議經歷了多次重大改…

apload-lab打靶場

1.提示顯示所以關閉js 上傳<?php phpinfo(); ?>的png形式 抓包&#xff0c;將png改為php 然后放包上傳成功 2.提示說檢查數據類型 抓包 將數據類型改成 image/jpeg 上傳成功 3.提示 可以用phtml&#xff0c;php5&#xff0c;php3 4.先上傳.htaccess文件&#xff0…

金融支付行業技術側重點

1. 合規問題 第三方支付系統的平穩運營&#xff0c;嚴格遵循《非銀行支付機構監督管理條例》的各項條款是基礎與前提&#xff0c;其中第十八條的規定堪稱重中之重&#xff0c;是支付機構必須牢牢把握的關鍵準則。 第十八條明確指出&#xff0c;非銀行支付機構需構建起必要且獨…

Cherry Studio + 火山引擎 構建個人AI智能知識庫

&#x1f349;在信息化時代&#xff0c;個人知識庫的構建對于提高工作效率、知識管理和信息提取尤為重要。尤其是當這些知識庫能結合人工智能來智能化地整理、分類和管理數據時&#xff0c;效果更為顯著。我最近嘗試通過 Cherry Studio 和 火山引擎 來搭建個人智能知識庫&#…

LeetCode 2 - 兩數相加

LeetCode 2 - 兩數相加 是一道經典鏈表操作問題&#xff0c;經常作為面試中基礎題的變體被考察。掌握多種解法及其變體&#xff0c;并熟悉其核心思路和模板代碼&#xff0c;可以快速備戰相關鏈表或大數計算問題。 題目描述 給定兩個非空鏈表&#xff0c;它們代表兩個非負整數&…

Qt之QStateMachine等待

在項目中經常需要等待&#xff0c;我們模擬0-30的數&#xff0c;假如我們其中5&#xff0c; 25的數需要進行等待&#xff0c;等待用戶處理完自己事情后&#xff0c;按下按鈕繼續&#xff0c;找Qt的項目中有一個 QStateMachineqstatemmachine類提供了一個分層有限狀態機。 QSta…

elpis全棧課程學習之elpis-core學習總結

elpis全棧課程學習之elpis-core學習總結 核心原理 elpis-core是全棧框架elpis的服務端內核&#xff0c;主要應用于服務端接口的開發以及頁面的SSR渲染&#xff0c;elpis-core基于約定優于配置的原理&#xff0c;通過一系列的loader來加載對應的文件&#xff0c;大大節約用戶的…

ChatGPT與DeepSeek:開源與閉源的AI模型之爭

目錄 一、模型架構與技術原理 二、性能能力與應用場景 三、用戶體驗與部署靈活性 四、成本與商業模式 五、未來展望與市場影響 六、總結 隨著人工智能技術的飛速發展&#xff0c;ChatGPT和DeepSeek作為兩大領先的AI語言模型&#xff0c;成為了行業內外關注的焦點。它們在…

在筆記本電腦上用DeepSeek搭建個人知識庫

最近DeepSeek爆火&#xff0c;試用DeepSeek的企業和個人越來越多。最常見的應用場景就是知識庫和知識問答。所以本人也試用了一下&#xff0c;在筆記本電腦上部署DeepSeek并使用開源工具搭建一套知識庫&#xff0c;實現完全在本地環境下使用本地文檔搭建個人知識庫。操作過程共…

DeepSeek蒸餾TinyLSTM實操指南

一、硬件準備 階段推薦配置最低要求訓練階段NVIDIA A100 80GB 4RTX 3090 24GB 1量化階段Intel Xeon Gold 6248R CPUi7-12700K + 64GB RAM部署階段Jetson Xavier NX開發套件Raspberry Pi 4B 8GB二、軟件環境搭建 # 創建Python虛擬環境 conda create -n distil python=3.9 conda…

Linux ls 命令

Linux ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于顯示指定工作目錄下之內容&#xff08;列出目前工作目錄所含的文件及子目錄)。 語法 ls [-alrtAFR] [name...] 參數 : -a 顯示所有文件及目錄 (. 開頭的隱藏文件也會列出)-d 只列出目…

LeetCode 熱題 100 53. 最大子數組和

LeetCode 熱題 100 | 53. 最大子數組和 大家好&#xff0c;今天我們來解決一道經典的算法題——最大子數組和。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求我們找出一個具有最大和的連續子數組&#xff0c;并返回其最大和。下面我將詳細講解解題思路&#xff0c;并…

【計算機網絡入門】初學計算機網絡(九)

目錄 1.令牌傳遞協議 2. 局域網&IEEE802 2.1 局域網基本概念和體系結構 3. 以太網&IEEE802.3 3.1 MAC層標準 3.1.1 以太網V2標準 ?編輯 3.2 單播廣播 3.3 沖突域廣播域 4. 虛擬局域網VLAN 1.令牌傳遞協議 先回顧一下令牌環網技術&#xff0c;多個主機形成…