1、pom依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.2</version>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
2、代码
properties
package org.zy.zbp.boot.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "minio")
@Component
@Data
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String nginxHost;
private String bucketName;
}
2、注册bean
package org.zy.zbp.boot.config.bean;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.zy.zbp.boot.config.properties.MinioProperties;
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfig {
@Autowired
private MinioProperties minioProperties;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(minioProperties.getEndpoint())
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
.build();
}
}
3、MinioUtil
package org.zy.zbp.boot.config.utils;
import cn.hutool.core.date.DateUtil;
import io.minio.*;
import io.minio.messages.Bucket;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.velocity.shaded.commons.io.FilenameUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.zy.zbp.boot.config.exception.BizAssert;
import org.zy.zbp.boot.config.properties.MinioProperties;
import org.zy.zbp.boot.model.vo.UploadFileVO;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.*;
@Component
@Slf4j
@AllArgsConstructor
public class MinioUtil {
private final MinioProperties minioProperties;
private final MinioClient minioClient;
private final Long maxSize = (long) (1024 * 1024);
public void createBucket(String bucketName) throws Exception {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
public static boolean isImage(MultipartFile imageFile) throws IOException {
Image img = ImageIO.read(imageFile.getInputStream());
if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {
return false;
}
return true;
}
public UploadFileVO uploadFile(MultipartFile file) throws Exception {
BizAssert.isTrue(isImage(file), "非图片格式!!");
String bucketName = minioProperties.getBucketName();
if (null == file || 0 == file.getSize()) {
return null;
}
createBucket(bucketName);
String fileName = file.getOriginalFilename();
String fileSuffix = FilenameUtils.getExtension(fileName);
String uniqueFileName = getUniqueFileName(fileSuffix);
String path = getPath("ZSTU-BIG-SCREEN", uniqueFileName);
log.info("file压缩前大小:{}",file.getSize());
if (file.getSize() > maxSize) {
FileItemFactory fileItemFactory = new DiskFileItemFactory();
FileItem fileItem = fileItemFactory.createItem(fileName, "text/plain", true, fileName);
OutputStream outputStream = fileItem.getOutputStream();
Thumbnails.of(file.getInputStream()).scale(1f)
.outputFormat(fileSuffix)
.outputQuality(0.25f).toOutputStream(outputStream);
file = new CommonsMultipartFile(fileItem);
}
log.info("file压缩后大小:{}",file.getSize());
minioClient.putObject(
PutObjectArgs.builder()
.stream(file.getInputStream(), file.getSize(), -1)
.bucket(bucketName)
.object(path)
.contentType(file.getContentType())
.build());
String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + path;
String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + path;
return new UploadFileVO(url, urlHost);
}
private String getUniqueFileName(String fileSuffix) {
return new StringJoiner(StrPool.DOT)
.add(UUID.randomUUID().toString().replace("-", ""))
.add(fileSuffix).toString();
}
private String getPath(String bizType, String uniqueFileName) {
return new StringJoiner(StrPool.SLASH)
.add(bizType)
.add(getDateFolder())
.add(uniqueFileName)
.toString();
}
private String getDateFolder() {
return LocalDate.now().format(DateTimeFormatter.ofPattern(DateUtils.SLASH_DATE_FORMAT));
}
public List<Bucket> getAllBuckets() throws Exception {
return minioClient.listBuckets();
}
public Optional<Bucket> getBucket(String bucketName) throws Exception {
return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
}
public void removeBucket(String bucketName) throws Exception {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
public String getObjectURL(String bucketName, String objectName, Integer expires) throws Exception {
return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(expires).build());
}
public InputStream getObject(String bucketName, String objectName) throws Exception {
return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
public void putObject(String bucketName, String objectName, InputStream stream) throws
Exception {
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName)
.stream(stream, stream.available(), -1).contentType(objectName.substring(objectName.lastIndexOf("."))).build());
}
public void putObject(String bucketName, String objectName, InputStream stream, long
size, String contextType) throws Exception {
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, size, -1).contentType(contextType).build());
}
public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {
return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
public void removeObject(String bucketName, String objectName) throws Exception {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
public UploadFileVO uploadVideo(MultipartFile file, String bucketName) throws Exception {
if (null == file || 0 == file.getSize()) {
return null;
}
createBucket(bucketName);
String originalFilename = file.getOriginalFilename();
assert originalFilename != null;
long now = System.currentTimeMillis() / 1000;
String fileName = DateUtil.format(DateUtil.date(), "yyyyMMdd") + "_" + now + "_" + new Random().nextInt(1000) +
originalFilename.substring(originalFilename.lastIndexOf("."));
log.info("file大小:{}", file.getSize());
minioClient.putObject(
PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
file.getInputStream(), file.getSize(), -1)
.contentType("video/mp4")
.build());
String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName;
String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName;
return new UploadFileVO(url, urlHost);
}
}