<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
<exclusions>
<exclusion>
<artifactId>okio</artifactId>
<groupId>com.squareup.okio</groupId>
</exclusion>
<exclusion>
<artifactId>okhttp</artifactId>
<groupId>com.squareup.okhttp3</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
package org.jeecg.config.oss;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Minio文件上传配置文件
* @author: jeecg-boot
*/
@Slf4j
@Configuration
public class MinioConfig {
@Value(value = "${minio-url}")
private String minioUrl;
@Value(value = "${minio-access}")
private String access;
@Value(value = "${minio-secret}")
private String secret;
@Bean
public MinioClient minioClient() {
MinioClient minioClient = MinioClient.builder().endpoint(minioUrl)
.credentials(access, secret)
.build();
return minioClient;
}
}
package org.jeecg.common.util;
import com.alibaba.fastjson.JSONObject;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
@Slf4j
@Component
public class MinioUtils {
@Autowired
private MinioClient client;
/**
* 创建bucket
*
* @param bucketName bucket名称
*/
@SneakyThrows
public void createBucket(String bucketName) {
if(!client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
client.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
/**
* 上传文件
*
* @param file 文件
* @param bucketName 存储桶
* @return
*/
public FileInfo uploadFile(MultipartFile file, String bucketName) throws Exception {
// 判断上传文件是否为空
if (null == file || 0 == file.getSize()) {
return null;
}
try {
// 判断存储桶是否存在
createBucket(bucketName);
// 文件名
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
InputStream stream = null;
//压缩图片
if (isPicture(suffix)) {
// 在项目根目录下的 upload 目录中生成临时文件
File newFile = new File(ClassUtils.getDefaultClassLoader().getResource("").getPath() + UUID.randomUUID() + "." + suffix);
// // 小于 1M 的
// if ((1024 * 1024 * 0.1) <= file.getSize() && file.getSize() <= (1024 * 1024)) {
// Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.3f).toFile(newFile);
// }
// // 1 - 2M 的
// else if ((1024 * 1024) < file.getSize() && file.getSize() <= (1024 * 1024 * 2)) {
// Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.2f).toFile(newFile);
// }
// // 2M 以上的
// else if ((1024 * 1024 * 2) < file.getSize()) {
// Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.1f).toFile(newFile);
// }
Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.1f).toFile(newFile);
// 获取输入流
stream = new FileInputStream(newFile);
// 删除临时文件
newFile.delete();
}else{
stream = file.getInputStream();
}
// 新的文件名 = 存储桶名称_时间戳.后缀名
String prefix = DateUtils.formatDate("yyyyMMdd");
String fileName = prefix+"/"+(originalFilename.substring(0,originalFilename.lastIndexOf(".")))+ "_"
+ System.currentTimeMillis() +"."+ suffix;
// 开始上传
PutObjectArgs objectArgs = PutObjectArgs.builder().object(fileName)
.bucket(bucketName)
.contentType("application/octet-stream")
.stream(stream,stream.available(),-1).build();
client.putObject(objectArgs);
FileInfo fi = new FileInfo();
fi.setFileName(originalFilename);
fi.setFileSize(file.getSize());
fi.setFilePath(fileName);
fi.setSuffix(suffix);
return fi;
} catch (Exception e) {
log.error("上传文件失败:{}", e.getMessage());
}
return null;
}
/**
* 判断文件是否为图片
*/
public boolean isPicture(String imgName) {
boolean flag = false;
if (StringUtils.isBlank(imgName)) {
return false;
}
String[] arr = {"bmp", "dib", "gif", "jfif", "jpe", "jpeg", "jpg", "png", "tif", "tiff", "ico"};
for (String item : arr) {
if (item.equals(imgName)) {
flag = true;
break;
}
}
return flag;
}
@Data
class FileInfo{
private long fileSize;
private String fileName;
private String suffix;
private String filePath;
}
}