Docker安裝Minio+SpringBoot上傳下載文件方式
更新時(shí)間:2024年10月31日 14:49:59 作者:Xiao_zuo_ya
本文主要介紹了如何通過(guò)Docker安裝Minio并進(jìn)行訪問(wèn)測(cè)試,同時(shí)也講解了如何在SpringBoot中上傳文件到Minio,內(nèi)容包含了pom文件引入依賴,application.properties配置,Minio配置,MinioClinet,FileService,FileServiceImpl的配置
Docker安裝Minio
docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外掛磁盤存儲(chǔ)使用 mkdir -p /usr/local/minio/data # 外掛配置文件使用 mkdir -p /usr/local/minio/config # 創(chuàng)建minio 容器 docker run -d --name minio -p 9000:9000 -p 9001:9001 -v /usr/local/minio/data:/data -v /usr/local/minio/config:/root/.minio -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWO RD=admin minio/minio server /data --console-address ":9001" # 創(chuàng)建失敗 docker logs minio FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials > Please provide correct credentials HINT: MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters # 密碼不能少于8個(gè)字符 docker rm minio docker run -d --name minio -p 9000:9000 -p 9001:9001 -v /usr/local/minio/data:/data -v /usr/local/minio/config:/root/.minio -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWO RD=admin123 minio/minio server /data --console-address ":9001" # 防火墻開(kāi)放端口 firewall-cmd --zone=public --add-port=9000/tcp --permanent firewall-cmd --zone=public --add-port=9001/tcp --permanent # 重啟防火墻 sudo firewall-cmd --reload
訪問(wèn)測(cè)試
http://ip:9001
SpringBoot上傳文件到Minio
pom文件引入依賴
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.2</version> </dependency>
application.properties配置Minio
spring.minio.access-key=pNehtjUDw9ENBlULVTGT spring.minio.secret-key=p3yVngZ2Ei1uCtn6vKozrof6ICB7GFBiYPr5RAWW spring.minio.endpoint=http://192.168.10.227:9000
配置MinioClinet
@Data @Configuration @ConfigurationProperties(prefix = "spring.minio") @Slf4j public class MinioConfig { private String accessKey; private String secretKey; private String endpoint; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } }
FileService
public interface FileService { /** * 是否存在桶 */ Boolean bucketExists(String bucketName); /** * 創(chuàng)建桶 */ void makeBucket(String bucketName); /** * 刪除桶 */ void removeBucket(String bucketName); /** * 獲取當(dāng)所有桶 */ List<Bucket> getAllBuckets(); /** * 上傳文件 */ String uploadFile(String bucketName, String prefix, MultipartFile file) throws Exception; /** * 文件預(yù)覽 */ String preview(String bucketName, String prefix, String fileName) throws Exception; /** * 文件下載 */ void download(String bucketName, String prefix, String fileName, HttpServletResponse res); /** * 刪除文件 */ Boolean removeFile(String bucketName, String prefix, String fileName); /** * 文件是否存在 */ boolean isFileExists(String bucketName, String prefix, String fileName) throws Exception; /** * 生成一個(gè)帶到期時(shí)間、簽名的URL,這個(gè)地址可以提供給沒(méi)有登錄的第三方共享訪問(wèn)或者上傳對(duì)象,針對(duì)于Bucket為私有的情況 */ String getPresignedObjectUrl(String bucketName, String prefix, String fileName); }
FileServiceImpl
package com.example.demo.service.impl; import java.util.List; import java.util.Objects; import java.util.UUID; import javax.servlet.http.HttpServletResponse; import cn.hutool.core.io.file.FileNameUtil; import com.example.demo.service.FileService; import io.minio.*; import io.minio.http.Method; import io.minio.messages.Bucket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** * @author :王建 * @since :2024-10-10 11:38 */ @Service @Slf4j public class FileServiceImpl implements FileService { @Autowired private MinioClient minioClient; @Override public Boolean bucketExists(String bucketName) { try { return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } catch (Exception e) { throw new RuntimeException(e); } } @Override public void makeBucket(String bucketName) { try { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { throw new RuntimeException(e); } } @Override public void removeBucket(String bucketName) { try { minioClient.removeBucket(RemoveBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { throw new RuntimeException(e); } } @Override public List<Bucket> getAllBuckets() { try { return minioClient.listBuckets(); } catch (Exception e) { throw new RuntimeException(e); } } @Override public String uploadFile(String bucketName, String prefix, MultipartFile file) throws Exception { String uuid = UUID.randomUUID().toString(); // 重新命名原來(lái)文件 String fileName = uuid + "." + FileNameUtil.extName(file.getOriginalFilename()); log.info("源文件名稱:{},重命名后文件名稱:{}", file.getOriginalFilename(), fileName); String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName; PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(objectName) .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build(); minioClient.putObject(objectArgs); return uuid; } @Override public String preview(String bucketName, String prefix, String fileName) throws Exception { // 查看文件地址 String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName; GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build(); return minioClient.getPresignedObjectUrl(build); } @Override public void download(String bucketName, String prefix, String fileName, HttpServletResponse res) { } @Override public Boolean removeFile(String bucketName, String prefix, String fileName) { return null; } @Override public boolean isFileExists(String bucketName, String prefix, String fileName) throws Exception { String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName; StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); return !Objects.isNull(statObjectResponse); } @Override public String getPresignedObjectUrl(String bucketName, String prefix, String fileName) { return null; } }
配置Minio允許直接預(yù)覽PDF文件
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用docker?部署mysql突然連接不上的問(wèn)題及解決方法
這篇文章主要介紹了使用docker?部署mysql,突然連接不上,要解決這個(gè)問(wèn)題需要找到根本原因,對(duì)癥治療就好,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06詳解Docker中安裝配置Oracle數(shù)據(jù)庫(kù)
本篇文章主要介紹了詳解Docker中安裝配置Oracle數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04詳解在Docker容器中運(yùn)行Spring Boot應(yīng)用
本文將以一個(gè)最簡(jiǎn)單的Spring Boot開(kāi)發(fā)的Web應(yīng)用為例,講解如何將其容器化運(yùn)行。本文的重點(diǎn)是構(gòu)建Docker鏡像、運(yùn)行Docker容器。2017-06-06手工制作docker鏡像-包含多個(gè)服務(wù)ssh+nginx
這篇文章主要介紹了手工制作docker鏡像-包含多個(gè)服務(wù)ssh+nginx,需要的朋友可以參考下2024-07-07Docker 常用命令整理及使用注意事項(xiàng)總結(jié)
這篇文章主要介紹了Docker 常用命令整理及使用注意事項(xiàng)總結(jié)的相關(guān)資料,這里整理了Docker 的常用命令,說(shuō)明這些命令是什么意思及使用方法,需要的朋友可以參考下2016-12-12解決Docker之mysql容器數(shù)據(jù)庫(kù)更改不生效的問(wèn)題
這篇文章主要介紹了解決Docker之mysql容器數(shù)據(jù)庫(kù)更改不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11