引入依赖
<minio.version>8.5.7</minio.version>
<!-- MinIO 依赖配置 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>${minio.version}</version>
</dependency>
编写配置文件
public class OssMinioCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String property = context.getEnvironment().getProperty("oss.minio.enable");
return StringUtils.equals("true", property);
}
}
@Data
@ConfigurationProperties(prefix = "oss.minio")
public class MinioProperties {
private Boolean enable = false;
private String endpoint;
private Boolean enableTls = false;
private String rootUser;
private String rootPassword;
private String bucketName;
}
@Slf4j
@Configuration
@AllArgsConstructor
@Conditional(OssMinioCondition.class)
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {
private final MinioProperties minioProperties;
private static final String UNIAPP = "uniapp";
private static final String SUFFIX = ".jpeg";
public List<UniappFile> uniappgetImageList() {
MinioClient minioClient = getMinioClient();
try {
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder()
.bucket(minioProperties.getBucketName())
.prefix(UNIAPP + "/")
.build());
if(results == null){
throw new CustomizeFileException(ReturnCode.USER_FILE_GET_IS_ABNORMAL);
}
List<UniappFile> files = new ArrayList<>();
for (Result<Item> result : results) {
Item item = result.get();
UniappFile uniappFile = new UniappFile();
String fileName = item.objectName().split("/")[1].split("\\.")[0];
uniappFile.setName(fileName);
uniappFile.setUrl(Constantes.HTTP + minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + item.objectName());
files.add(uniappFile);
}
return files;
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.USER_FILE_GET_IS_ABNORMAL);
}
}
public String uniappUpdateImage(MultipartFile file, String name) {
MinioClient minioClient = getMinioClient();
String key;
InputStream inputStream = null;
try {
if (file == null) {
throw new CustomizeFileException(ReturnCode.USER_DO_NOT_UPLOAD_FILE);
}
key = StringUtils.isBlank(StringUtils.trim(name)) ? UNIAPP + SUFFIX : UNIAPP + "/" + name + SUFFIX;
inputStream = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(key)
.stream(inputStream, inputStream.available(), 5 * 1024 * 1024).build());
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.FILE_UPLOAD_EXCEPTION);
} finally {
IOUtils.closeQuietly(inputStream);
}
return (minioProperties.getEnableTls() ? Constantes.HTTPS : Constantes.HTTP)
+ minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + key;
}
public String uniappgetImage(String name) {
MinioClient minioClient = getMinioClient();
try {
GetObjectResponse response = minioClient.getObject(GetObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(UNIAPP + "/" + name + SUFFIX)
.build());
if(response == null){
throw new CustomizeFileException(ReturnCode.USER_FILE_ADDRESS_IS_ABNORMAL);
}
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.USER_FILE_ADDRESS_IS_ABNORMAL);
}
String imageKey = UNIAPP + "/" + name + SUFFIX;
return Constantes.HTTP + minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + imageKey;
}
public String uniappUpload(MultipartFile file, String name) {
MinioClient minioClient = getMinioClient();
String key;
InputStream inputStream = null;
try {
if (file == null) {
throw new CustomizeFileException(ReturnCode.USER_DO_NOT_UPLOAD_FILE);
}
key = StringUtils.isBlank(StringUtils.trim(name)) ? UNIAPP + SUFFIX : UNIAPP + "/" + name + SUFFIX;
inputStream = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(key)
.stream(inputStream, inputStream.available(), 5 * 1024 * 1024).build());
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.FILE_UPLOAD_EXCEPTION);
} finally {
IOUtils.closeQuietly(inputStream);
}
return (minioProperties.getEnableTls() ? Constantes.HTTPS : Constantes.HTTP)
+ minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + key;
}
public String uploadToMinio(MultipartFile file, String rootPath) {
MinioClient minioClient = getMinioClient();
String key;
InputStream inputStream = null;
try {
if (file == null) {
throw new CustomizeFileException(ReturnCode.USER_DO_NOT_UPLOAD_FILE);
}
String originalName = StringUtils.isNotBlank(file.getOriginalFilename()) ? file.getOriginalFilename() : file.getName();
String suffix = FilenameUtils.getExtension(originalName);
if (StringUtils.isEmpty(suffix)) {
suffix = "." + Constantes.UNKNOWN_FILE_TYPE_SUFFIX;
} else {
suffix = "." + suffix;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + System.currentTimeMillis() + suffix;
key = StringUtils.isBlank(StringUtils.trim(rootPath)) ? fileName : rootPath + "/" + fileName;
inputStream = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(key)
.stream(inputStream, inputStream.available(), 5 * 1024 * 1024).build());
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.FILE_UPLOAD_EXCEPTION);
} finally {
IOUtils.closeQuietly(inputStream);
}
return (minioProperties.getEnableTls() ? Constantes.HTTPS : Constantes.HTTP)
+ minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + key;
}
public String uploadToMinio(InputStream inputStream, String suffix, String rootPath) {
MinioClient minioClient = getMinioClient();
String key;
try {
if (ObjectUtils.isEmpty(inputStream)) {
throw new CustomizeFileException(ReturnCode.USER_DO_NOT_UPLOAD_FILE);
}
if (StringUtils.isEmpty(suffix)) {
suffix = "." + Constantes.UNKNOWN_FILE_TYPE_SUFFIX;
} else {
suffix = "." + suffix;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + System.currentTimeMillis() + suffix;
key = StringUtils.isBlank(StringUtils.trim(rootPath)) ? fileName : rootPath + "/" + fileName;
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(key)
.stream(inputStream, inputStream.available(), 5 * 1024 * 1024).build());
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.FILE_UPLOAD_EXCEPTION);
} finally {
IOUtils.closeQuietly(inputStream);
}
return (minioProperties.getEnableTls() ? Constantes.HTTPS : Constantes.HTTP)
+ minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + key;
}
public String uploadToMinio(byte[] bytes, String suffix, String rootPath) {
MinioClient minioClient = getMinioClient();
String key;
InputStream inputStream = null;
try {
if (ObjectUtils.isEmpty(bytes)) {
throw new CustomizeFileException(ReturnCode.USER_DO_NOT_UPLOAD_FILE);
}
inputStream = new ByteArrayInputStream(bytes);
if (StringUtils.isEmpty(suffix)) {
suffix = "." + Constantes.UNKNOWN_FILE_TYPE_SUFFIX;
} else {
suffix = "." + suffix;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + System.currentTimeMillis() + suffix;
key = StringUtils.isBlank(StringUtils.trim(rootPath)) ? fileName : rootPath + "/" + fileName;
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(key)
.stream(inputStream, inputStream.available(), 5 * 1024 * 1024).build());
} catch (Exception e) {
e.printStackTrace();
throw new CustomizeFileException(ReturnCode.FILE_UPLOAD_EXCEPTION);
} finally {
IOUtils.closeQuietly(inputStream);
}
return (minioProperties.getEnableTls() ? Constantes.HTTPS : Constantes.HTTP)
+ minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + key;
}
public boolean deleteInMinio(String url) {
MinioClient minioClient = getMinioClient();
String[] split = url.split(minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/");
if (split.length != 2) {
throw new CustomizeReturnException(ReturnCode.USER_FILE_ADDRESS_IS_ABNORMAL);
}
String key = split[1];
try {
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.object(key).build());
} catch (Exception e) {
throw new CustomizeFileException(ReturnCode.USER_FILE_DELETION_IS_ABNORMAL);
}
return true;
}
private MinioClient getMinioClient() {
try {
String[] ipAndPort = minioProperties.getEndpoint().split(":");
return MinioClient.builder()
.endpoint(ipAndPort[0], Integer.parseInt(ipAndPort[1]), minioProperties.getEnableTls())
.credentials(minioProperties.getRootUser(), minioProperties.getRootPassword())
.build();
} catch (Exception e) {
log.error("MinIO服务器构建异常:{}", e.getMessage());
throw new CustomizeFileException(ReturnCode.FILE_UPLOAD_EXCEPTION);
}
}
@PostConstruct
private void initDi() {
log.info("############ {} Configuration DI.", this.getClass().getSimpleName());
}
}
oss:
minio:
enable: true
endpoint: 159.xxx.xxx.xxx:9000
rootUser: minio
rootPassword: ovoAdmin123
enable-tls: false
bucket-name: public
编写工具类
@Slf4j
public class MinioUtils {
private static final MinioConfiguration MINIO_CONFIGURATION = SpringContextHolder.getBean(MinioConfiguration.class);
public static String upload(MultipartFile file, String rootPath) {
return MINIO_CONFIGURATION.uploadToMinio(file, rootPath);
}
public static String uniappUpload(MultipartFile file, String name) {
return MINIO_CONFIGURATION.uniappUpload(file, name);
}
public static String uniappgetImage(String name) {
return MINIO_CONFIGURATION.uniappgetImage(name);
}
public static List<UniappFile> uniappgetImageList() {
return MINIO_CONFIGURATION.uniappgetImageList();
}
public static String uniappUpdateImage(MultipartFile file, String name) {
return MINIO_CONFIGURATION.uniappUpdateImage(file, name);
}
public static String upload(InputStream inputStream, String suffix, String rootPath) {
return MINIO_CONFIGURATION.uploadToMinio(inputStream, suffix, rootPath);
}
public static String upload(byte[] bytes, String suffix, String rootPath) {
return MINIO_CONFIGURATION.uploadToMinio(bytes, suffix, rootPath);
}
public static boolean delete(String url) {
return MINIO_CONFIGURATION.deleteInMinio(url);
}
}
编写Controller
@Api(tags = "文件相关接口")
@Slf4j
@RestController
@RequestMapping(value = "/system/minio")
public class MinioController {
@ApiOperation(value = "文件上传返回url")
@PostMapping("/upload")
public R<String> upload(@RequestParam(value = "file") MultipartFile file, String rootPath) {
String objectName = MinioUtils.upload(file, rootPath);
if (null != objectName) {
return Re.ok(objectName);
}
return Re.fail("上传失败");
}
@ApiOperation(value = "删除文件", notes = "根据url地址删除文件")
@PostMapping("/delete")
public R<String> remove(String url) {
boolean result = MinioUtils.delete(url);
if (result) {
return Re.ok("删除成功");
}
return Re.fail("删除失败");
}
@ApiOperation(value = "上传小程序背景图")
@PostMapping("/uniapp/upload")
public R<String> uniappUpload(@RequestParam(value = "file") MultipartFile file, @RequestParam(value = "name") String name) {
String objectName = MinioUtils.uniappUpload(file, name);
if (null != objectName) {
return Re.ok("上传成功!", objectName);
}
return Re.fail("上传失败!");
}
@ApiOperation(value = "获取小程序背景图")
@GetMapping("/uniapp/getImage")
public R<String> uniappgetImage(@RequestParam(value = "name") String name) {
String url = MinioUtils.uniappgetImage(name);
if (null != url) {
return Re.ok("获取成功!",url);
}
return Re.fail("获取失败!");
}
@ApiOperation(value = "获取小程序背景图列表")
@GetMapping("/uniapp/getImageList")
public R<List<UniappFile>> uniappgetImageList() {
List<UniappFile> list = MinioUtils.uniappgetImageList();
if (null != list) {
return Re.ok("获取成功!", list);
}
return Re.fail("获取失败!");
}
@ApiOperation(value = "修改小程序背景图")
@PostMapping("/uniapp/updateImage")
public R<String> uniappUpdateImage(@RequestParam(value = "file") MultipartFile file, @RequestParam(value = "name") String name) {
String objectName = MinioUtils.uniappUpdateImage(file, name);
if (null != objectName) {
return Re.ok("修改成功!", objectName);
}
return Re.fail("修改失败!");
}
}