windows环境下搭建minio步骤
1.从minio官网进行查看详细信息
地址:https://min.io/
里面有详细的配置信息
搭建成功之后如下如所示:用户名密码默认情况下为 username:minioadmin password:minioadmin

2.搭建成功之后的访问
地址:服务ip 端口9000
http//127.0.0.1:9000 用户名密码为默认:minioadmin
创建桶时候要注意桶的名称

springboot整合和minio的步骤如下
1.pom坐标的指定
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
<!-- Hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.18</version>
</dependency>
2.配置文件的设置如下
package com.java.javamethod.conf;
import io.minio.MinioClient;
import lombok.SneakyThrows;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
@ConditionalOnProperty(value = "oss.name", havingValue = "minio")
public class MinioConfiguration {
@Resource
private MinioProperties ossProperties;
@Bean
@SneakyThrows
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(ossProperties.getEndpoint())
.credentials(ossProperties.getAccessKey(), ossProperties.getSecretKey())
.build();
}
}
package com.java.javamethod.conf;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@Data
@ConfigurationProperties(prefix = MinioProperties.PREFIX)
public class MinioProperties {
public static final String PREFIX = "oss";
private String name;
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName = "qditwei";
private List<String> fileExt;
}
3.minio工具类的封装
package com.java.javamethod.service;
import com.java.javamethod.domain.OssFile;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
public interface OssTemplate {
boolean bucketExists(String bucketName);
OssFile getOssInfo(String fileName);
OssFile upLoadFile(String folderName, String fileName, MultipartFile file);
OssFile upLoadFile(String folderName, String fileName, String suffix, InputStream stream);
boolean removeFile(String fileName);
boolean removeFiles(List<String> fileNames);
void downloadFile(HttpServletResponse response, String fileName, String filePath);
}
package com.java.javamethod.util;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.ObjectUtil;
import com.java.javamethod.conf.MinioProperties;
import com.java.javamethod.domain.OssFile;
import com.java.javamethod.service.OssTemplate;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.DeleteObject;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Stream;
@Slf4j
@Service
public class MinioTemplate implements OssTemplate {
@Resource
private MinioClient client;
@Resource
private MinioProperties ossProperties;
private static final String DATE_FORMAT = "yyyyMMdd";
private static final String ENCODING = "UTF-8";
@Override
public boolean bucketExists(String bucketName) {
try {
return client.bucketExists(BucketExistsArgs.builder().bucket(getBucketName(bucketName)).build());
} catch (Exception e) {
log.error("minio bucketExists Exception:{}", e);
}
return false;
}
public void makeBucket(String bucketName) {
try {
if (!client.bucketExists(BucketExistsArgs.builder().bucket(getBucketName(bucketName)).build())) {
client.makeBucket(MakeBucketArgs.builder().bucket(getBucketName(bucketName)).build());
log.info("minio makeBucket success bucketName:{}", bucketName);
}
} catch (Exception e) {
log.error("minio makeBucket Exception:{}", e);
}
}
@Override
public OssFile getOssInfo(String fileName) {
try {
StatObjectResponse stat = client.statObject(
StatObjectArgs.builder().bucket(getBucketName(ossProperties.getBucketName())).object(fileName)
.build());
OssFile ossFile = new OssFile();
ossFile.setName(ObjectUtil.isEmpty(stat.object()) ? fileName : stat.object());
ossFile.setFilePath(ossFile.getName());
ossFile.setDomain(getOssHost(ossProperties.getBucketName()));
ossFile.setHash(String.valueOf(stat.hashCode()));
ossFile.setSize(stat.size());
ossFile.setPutTime(DateUtil.date(stat.lastModified().toLocalDateTime()));
ossFile.setContentType(stat.contentType());
return ossFile;
} catch (Exception e) {
log.error("minio getOssInfo Exception:{}", e);
}
return null;
}
@Override
@SneakyThrows
public OssFile upLoadFile(String folderName, String fileName, MultipartFile file) throws RuntimeException {
if (file == null || file.isEmpty()) {
throw new RuntimeException("文件不能为空");
}
if (file.getSize() > 5 * 1024 * 1024) {
throw new RuntimeException("文件大小不能超过5M");
}
String suffix = getFileExtension(file.getOriginalFilename());
try {
return upLoadFile(folderName, fileName, suffix, file.getInputStream());
} catch (Exception e) {
log.error("minio upLoadFile Exception:{}", e);
throw new RuntimeException("文件上传失败,请重新上传或联系管理员");
}
}
public static String getFileExtension(String fullName) {
Assert.notNull(fullName, "minio file fullName is null.");
String fileName = new File(fullName).getName();
int dotIndex = fileName.lastIndexOf('.');
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}
@Override
public OssFile upLoadFile(String folderName, String fileName, String suffix, InputStream stream) {
try {
return upLoadFile(ossProperties.getBucketName(), folderName, fileName, suffix, stream,
"application/octet" + "-stream");
} catch (Exception e) {
log.error("minio upLoadFile Exception:{}", e);
}
return null;
}
@SneakyThrows
public OssFile upLoadFile(String bucketName, String folderName, String fileName, String suffix, InputStream stream,
String contentType) {
if (!bucketExists(bucketName)) {
log.info("minio bucketName is not creat");
makeBucket(bucketName);
}
OssFile file = new OssFile();
String originalName = fileName;
String filePath = getFilePath(folderName, fileName, suffix);
client.putObject(PutObjectArgs.builder().bucket(getBucketName(bucketName)).object(filePath)
.stream(stream, stream.available(), -1).contentType(contentType).build());
file.setOriginalName(originalName);
file.setName(filePath);
file.setDomain(getOssHost(bucketName));
file.setFilePath(filePath);
stream.close();
log.info("minio upLoadFile success, filePath:{}", filePath);
return file;
}
@Override
public boolean removeFile(String fileName) {
try {
client.removeObject(
RemoveObjectArgs.builder().bucket(getBucketName(ossProperties.getBucketName())).object(fileName)
.build());
log.info("minio removeFile success, fileName:{}", fileName);
return true;
} catch (Exception e) {
log.error("minio removeFile fail, fileName:{}, Exception:{}", fileName, e);
}
return false;
}
@Override
public boolean removeFiles(List<String> fileNames) {
try {
Stream<DeleteObject> stream = fileNames.stream().map(DeleteObject::new);
client.removeObjects(RemoveObjectsArgs.builder().bucket(getBucketName(ossProperties.getBucketName()))
.objects(stream::iterator).build());
log.info("minio removeFiles success, fileNames:{}", fileNames);
return true;
} catch (Exception e) {
log.error("minio removeFiles fail, fileNames:{}, Exception:{}", fileNames, e);
}
return false;
}
@Override
public void downloadFile(HttpServletResponse response, String fileName, String filePath) {
GetObjectResponse is = null;
try {
GetObjectArgs getObjectArgs =
GetObjectArgs.builder().bucket(ossProperties.getBucketName()).object(filePath)
.build();
is = client.getObject(getObjectArgs);
response.setContentType("application/x-msdownload");
response.setCharacterEncoding(ENCODING);
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, ENCODING));
IoUtil.copy(is, response.getOutputStream());
log.info("minio downloadFile success, filePath:{}", filePath);
} catch (Exception e) {
log.error("minio downloadFile Exception:{}", e);
} finally {
IoUtil.close(is);
}
}
public String getPresignedObjectUrl(String bucketName, String fileName, Integer expires) {
String link = "";
try {
link = client.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(getBucketName(bucketName))
.object(fileName).expiry(expires).build());
} catch (Exception e) {
log.error("minio getPresignedObjectUrl is fail, fileName:{}", fileName);
}
return link;
}
private String getBucketName(String bucketName) {
return bucketName;
}
private String getFilePath(String folderName, String originalFilename, String suffix) {
return StrPool.SLASH + String.join(StrPool.SLASH, folderName, DateUtil.date().toString(DATE_FORMAT),
originalFilename) + StrPool.C_UNDERLINE + DateUtil.current() + StrPool.DOT + suffix;
}
public String getOssHost(String bucketName) {
return ossProperties.getEndpoint() + StrPool.SLASH + getBucketName(bucketName);
}
}
4.swagger功能的验证
package com.java.javamethod.controller;
import com.java.javamethod.domain.OssFile;
import com.java.javamethod.util.MinioTemplate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@RestController
@Api(tags = "文件控制器", description = "文件管理控制器")
public class FileController {
@Resource
MinioTemplate minioTemplate;
@PostMapping("/upload")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "folderName", value = "文件路径", required = true, dataType = "String"),
@ApiImplicitParam(name = "fileName", value = "文件名", required = true, dataType = "String")
})
public OssFile upload(String folderName, String fileName,@RequestPart MultipartFile file) {
return minioTemplate.upLoadFile( folderName, fileName, file);
}
}

