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"
- 參數解析
-
docker run 運行容器
啟動一個新的 Docker 容器,如果鏡像不存在,會自動拉取。
-
-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 的管理界面。 -
–name minio(容器名稱)
? --name minio 給該容器命名為 minio,這樣之后可以通過 docker stop minio / docker start minio 來管理它,而不需要使用容器 ID。 -
–restart=always(自動重啟)
? --restart=always 讓容器 始終自動重啟,包括:
? Docker 進程重啟后,容器也會自動重啟。
? 容器異常退出時,Docker 也會自動重啟它。
? 但如果你 手動停止容器 (docker stop minio),它不會重啟。 -
-v ~/minio/data:/data(數據持久化)
? -v ~/minio/data:/data 掛載數據卷,把 宿主機 ~/minio/data 目錄映射到 容器內 /data 目錄:
? 這樣 MinIO 存儲的數據不會隨著容器刪除而丟失。
? ~/minio/data 目錄存儲 MinIO 內部的對象數據。 -
-e “MINIO_ROOT_USER=admin”(環境變量)
? -e 傳遞環境變量,設置 MinIO 的 管理員用戶名 為 admin。 -
-e “MINIO_ROOT_PASSWORD=yourpassword.”(環境變量)
? 設定 MinIO 管理員密碼 為 自己設置.。 -
-d quay.io/minio/minio(后臺運行 & 指定鏡像)
? -d 讓容器 后臺運行(detach mode)。
? quay.io/minio/minio 指定 MinIO 官方鏡像(托管在 quay.io,類似于 docker.io)。 -
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
}