feat: minio存储桶的增删改查,数据的增删改查

This commit is contained in:
zlg
2024-06-26 17:50:45 +08:00
parent 67362ad6b9
commit 4652e84c32
5 changed files with 239 additions and 6 deletions

View File

@@ -2,19 +2,31 @@ package com.schisandra.oss.application.controller;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSON;
import com.amazonaws.util.IOUtils;
import com.google.common.base.Preconditions;
import com.schisandra.oss.application.convert.SchisandraOssMinioDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssMinioDTO;
import com.schisandra.oss.application.oss.core.minio.MinioOssClient;
import com.schisandra.oss.application.oss.core.minio.MinioOssConfiguration;
import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig;
import com.schisandra.oss.application.oss.model.OssInfo;
import com.schisandra.oss.common.entity.Result;
import com.schisandra.oss.domain.redis.RedisUtil;
import com.schisandra.oss.domain.bo.SchisandraOssMinioBO;
import com.schisandra.oss.domain.redis.RedisUtil;
import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService;
import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
@@ -145,6 +157,127 @@ public class SchisandraOssMinioController {
return Result.ok(schisandraOssMinioDTOS);
}
/**
* @description: 获取文件目录信息
* @param: [target, userId, dirName]
* @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @author zlg
* @date: 2024/6/26 13:55
*/
@GetMapping("listMinioDir")
public Result<String> listMinioInfo(@RequestParam String target, @RequestParam String userId, @RequestParam String dirName,@RequestParam String bucket) throws Exception {
Preconditions.checkNotNull(target, "不能为空");
Preconditions.checkNotNull(userId, "不能为空");
MinioOssClient bean = SpringUtil.getBean(userId);
bean.getMinioOssConfig().setBucketName(bucket);
return Result.ok(bean.listDir(target, dirName));
}
/**
* @description: 下载文件
* @param: [schisandraOssMinioDTO]
* @return: void
* @author zlg
* @date: 2024/6/26 13:56
*/
@GetMapping("downloadMinioFile")
public void getMinioFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam String filePath, HttpServletResponse response) throws Exception {
Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(filePath, "不能为空");
MinioOssClient bean = SpringUtil.getBean(userId);
bean.getMinioOssConfig().setBucketName(bucket);
InputStream stream = bean.getMinioObject(bucket, filePath);
ServletOutputStream output = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filePath.substring(filePath.lastIndexOf("/") + 1), "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
IOUtils.copy(stream, output);
}
/**
* @description: 删除文件
* @param: [schisandraOssMinioDTO]
* @return: void
* @author zlg
* @date: 2024/6/26 14:34
*/
@PostMapping("deleteMinioFile")
public Result deleteMinioFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam String filePath) {
Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(filePath, "不能为空");
MinioOssClient bean = SpringUtil.getBean(userId);
bean.getMinioOssConfig().setBucketName(bucket);
bean.delete(filePath);
return Result.ok();
}
/**
* @description: 上传文件
* @param: [schisandraOssMinioDTO]
* @return: void
* @author zlg
* @date: 2024/6/26 14:34
*/
@PostMapping("uploadMinioFile")
public Result<OssInfo> uploadMinioFile(@RequestParam String userId, @RequestParam MultipartFile file, @RequestParam String fileName, @RequestParam String bucket) throws IOException {
Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(fileName, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空");
// 获取文件输入流
InputStream is = file.getInputStream();
MinioOssClient bean = SpringUtil.getBean(userId);
bean.getMinioOssConfig().setBucketName(bucket);
return Result.ok(bean.upLoad(is, fileName, true));
}
/**
* @description: 获取所有bucket
* @param: [userId, bucket]
* @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @author zlg
* @date: 2024/6/26 17:37
*/
@PostMapping("seleteBucket")
public Result<String> seleteBucket(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
Preconditions.checkNotNull(userId, "不能为空");
MinioOssClient bean = SpringUtil.getBean(userId);
return Result.ok(bean.selectAllBucket());
}
/**
* @description: 创建bucket
* @param: [userId, bucket]
* @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @author zlg
* @date: 2024/6/26 17:38
*/
@PostMapping("createBucket")
public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket) {
Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空");
MinioOssClient bean = SpringUtil.getBean(userId);
bean.getMinioOssConfig().setBucketName(bucket);
return Result.ok(bean.createBucket(bucket));
}
/**
* @description: 删除bucket
* @param: [userId, bucket]
* @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @author zlg
* @date: 2024/6/26 17:38
*/
@PostMapping("deleteBucket")
public Result<String> deleteBucket(@RequestParam String userId, @RequestParam String bucket) {
Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空");
MinioOssClient bean = SpringUtil.getBean(userId);
bean.getMinioOssConfig().setBucketName(bucket);
return Result.ok(bean.deleteBucket(bucket));
}
private void parameterCheck(SchisandraOssMinioDTO schisandraOssMinioDTO) {
Preconditions.checkNotNull(schisandraOssMinioDTO.getId(), "不能为空");

View File

@@ -58,7 +58,7 @@ public class JdOssClient implements StandardOssClient {
private JdOssConfig jdOssConfig;
@Override
public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) {
public OssInfo upLoad(InputStream is, String targetName,Boolean isOverride) {
String bucketName = getBucket();
String key = getKey(targetName, false);

View File

@@ -58,7 +58,7 @@ public class JinShanOssClient implements StandardOssClient {
private JinShanOssConfig jinShanOssConfig;
@Override
public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) {
public OssInfo upLoad(InputStream is, String targetName,Boolean isOverride) {
String bucket = getBucket();
String key = getKey(targetName, false);
if (isOverride || !ks3.objectExists(bucket, key)) {

View File

@@ -9,8 +9,8 @@ import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.util.StringUtils;
import com.aliyun.oss.common.utils.HttpHeaders;
import com.google.common.io.ByteStreams;
import com.schisandra.oss.application.oss.constant.OssConstant;
import com.schisandra.oss.application.oss.core.StandardOssClient;
import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig;
@@ -22,6 +22,8 @@ import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint;
import com.schisandra.oss.application.oss.model.download.DownloadObjectStat;
import com.schisandra.oss.application.oss.utils.OssPathUtil;
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -31,8 +33,11 @@ import okhttp3.Headers;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
/**
@@ -55,6 +60,90 @@ public class MinioOssClient implements StandardOssClient {
private MinioClient minioClient;
private MinioOssConfig minioOssConfig;
public MinioOssConfig getMinioOssConfig() {
return minioOssConfig;
}
public void setMinioOssConfig(MinioOssConfig minioOssConfig) {
this.minioOssConfig = minioOssConfig;
}
public String createBucket(String bucketName) {
try {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}else {
return "bucket already exists";
}
} catch (Exception e) {
e.printStackTrace();
}
return bucketName;
}
public String deleteBucket(String bucketName) {
try {
if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())){
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}else {
return "bucket not exists";
}
}catch (Exception e) {
e.printStackTrace();
}
return "success";
}
public List<String> selectAllBucket() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
List<Bucket> list = minioClient.listBuckets();
List<String> names = new ArrayList<>();
list.forEach(bucket -> {
names.add(bucket.name());
});
return names;
}
/**
* @description: 获取目录文件信息
* @param: [bucket, dirName]
* @return: java.util.List<com.schisandra.oss.application.oss.model.OssInfo>
* @author zlg
* @date: 2024/6/26 13:34
*/
public List<OssInfo> listDir(String bucket, String dirName) throws Exception {
Iterable<Result<Item>> results = null;
if (StringUtils.isEmpty(dirName)) {
results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucket).recursive(false).build());
} else {
results = minioClient.listObjects(
ListObjectsArgs.builder().prefix(dirName).bucket(bucket).recursive(false).build());
}
List<OssInfo> infos = new ArrayList<>();
results.forEach(r -> {
OssInfo info = new OssInfo();
try {
Item item = r.get();
if (item.isDir()) {
String[] directories = item.objectName().split("/");
info.setName(directories[directories.length - 1]);
info.setPath(item.objectName());
info.setIsDir(item.isDir());
} else {
String[] files = item.objectName().split("/");
info.setName(files[files.length - 1]);
info.setPath(item.objectName());
info.setIsDir(item.isDir());
info.setLength(String.valueOf(item.size()));
info.setCreateTime(String.valueOf(item.lastModified()));
}
infos.add(info);
} catch (Exception e) {
e.printStackTrace();
}
});
return infos;
}
@Override
public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) {
try {
@@ -68,7 +157,7 @@ public class MinioOssClient implements StandardOssClient {
} catch (Exception e) {
throw new OssException(e);
}
return getInfo(targetName);
return getBaseInfo(targetName);
}
@Override
@@ -85,12 +174,13 @@ public class MinioOssClient implements StandardOssClient {
public void downLoad(OutputStream os, String targetName) {
GetObjectResponse is = null;
try {
GetObjectArgs getObjectArgs = GetObjectArgs.builder()
.bucket(getBucket())
.object(getKey(targetName, true))
.build();
is = minioClient.getObject(getObjectArgs);
ByteStreams.copy(is, os);
IoUtil.copy(is, os);
} catch (Exception e) {
throw new OssException(e);
} finally {
@@ -184,6 +274,12 @@ public class MinioOssClient implements StandardOssClient {
throw new OssException(e);
}
}
public InputStream getMinioObject(String bucket, String dirName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
InputStream stream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucket).object(dirName).build());
return stream;
}
@Override
public OssInfo getInfo(String targetName, Boolean isRecursion) {

View File

@@ -14,6 +14,10 @@ public class OssInfo {
* 名称
*/
private String name;
/**
* 是否是文件夹
*/
private Boolean isDir;
/**
* 存储路径
*/