Docker安裝Minio+SpringBoot上傳下載文件方式
更新時間:2024年10月31日 14:49:59 作者:Xiao_zuo_ya
本文主要介紹了如何通過Docker安裝Minio并進行訪問測試,同時也講解了如何在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
# 外掛磁盤存儲使用
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個字符
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"
# 防火墻開放端口
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanent
# 重啟防火墻
sudo firewall-cmd --reload訪問測試
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);
/**
* 獲取當所有桶
*/
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;
/**
* 生成一個帶到期時間、簽名的URL,這個地址可以提供給沒有登錄的第三方共享訪問或者上傳對象,針對于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();
// 重新命名原來文件
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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker?Desktop?啟用?Kubernetes?失敗后處理方案
?在setting -> Kubernetes 中,選中 Enable Kubernetes 后,長時間顯示 Starting ...? ,在Images中顯示幾個自動下載的鏡像后,顯示 Start Kubernetes failed,這篇文章主要介紹了Docker?Desktop啟用Kubernetes失敗后處理方法,需要的朋友可以參考下2023-08-08
使用Docker構(gòu)建開發(fā)環(huán)境的方法步驟(?Windows和mac)
利用Docker,我們可以做很多事情。所以本文就詳細介紹了使用Docker構(gòu)建開發(fā)環(huán)境的方法步驟,分為?Windows和mac版本,具有一定的參考價值,感興趣的可以了解一下2021-12-12
Docker-compose 建立ELK集群的實現(xiàn)方法
這篇文章主要介紹了Docker-compose 建立ELK集群的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

