java springboot集成对象存储minio(对象存储minio)
1.导入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.0</version>
</dependency>
2.yml配置
spring:
servlet:
multipart:
max-file-size: 200MB
max-request-size: 200MB
minio:
endpoint: http://127.0.0.1:9000
accessKey: minioadmin
secretKey: minioadmin
3.写配置类(注册minio客户端,以便在代码中使用客户端上传文件)
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
@Configuration
public class MinioConfig {
@Value("${minio.url}")
private String url;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient getMinioClient() {
return MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
}
}
4.写minio实体类
@Data
import lombok.Data;
@Data
public class Fileinfo {
String filename;
Boolean directory;
}
5.写minio工具类
import com.base.dao.entity.Fileinfo;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@Component
public class MinioUtil {
@Autowired
private MinioClient minioClient;
public void createBucket(String bucket) throws Exception {
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
}
}
public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
.stream(stream, -1, 10485760).build());
}
public List<String> listBuckets() throws Exception {
List<Bucket> list = minioClient.listBuckets();
List<String> names = new ArrayList<>();
list.forEach(b -> {
names.add(b.name());
});
return names;
}
public List<Fileinfo> listFiles(String bucket) throws Exception {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucket).recursive(true).build());
List<Fileinfo> infos = new ArrayList<>();
results.forEach(r->{
Fileinfo info = new Fileinfo();
try {
Item item = r.get();
info.setFilename(item.objectName());
info.setDirectory(item.isDir());
infos.add(info);
} catch (Exception e) {
e.printStackTrace();
}
});
return infos;
}
public InputStream download(String bucket, String objectName) throws Exception {
InputStream stream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucket).object(objectName).build());
return stream;
}
public void deleteBucket(String bucket) throws Exception {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
}
public void deleteObject(String bucket, String objectName) throws Exception {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());
}
public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) throws Exception {
this.createBucket(targetBucket);
minioClient.copyObject(CopyObjectArgs.builder().bucket(targetBucket).object(targetObject)
.source(CopySource.builder().bucket(sourceBucket).object(sourceObject).build()).build());
}
public String getObjectInfo(String bucket, String objectName) throws Exception {
return minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(objectName).build()).toString();
}
public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
.builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();
return minioClient.getPresignedObjectUrl(build);
}
public List<Fileinfo> listAllFile() throws Exception {
List<String> list = this.listBuckets();
List<Fileinfo> fileinfos = new ArrayList<>();
for (String bucketName : list) {
fileinfos.addAll(this.listFiles(bucketName));
}
return fileinfos;
}
}
6.写控制器
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
@RestController
@Slf4j
@RequestMapping(value = "/file")
public class FileController {
@Autowired
MinioUtil minioUtil;
@PostMapping(value = "/uploadfile")
@MyLog(value = "上传一个文件",name = "上传")
public String fileupload(@RequestParam MultipartFile uploadfile, @RequestParam String bucket,
@RequestParam(required = false) String objectName) throws Exception {
log.info("fileupload input param object:{}", bucket,objectName);
minioUtil.createBucket(bucket);
if (objectName != null) {
minioUtil.uploadFile(uploadfile.getInputStream(), bucket, objectName + "/" + uploadfile.getOriginalFilename());
} else {
minioUtil.uploadFile(uploadfile.getInputStream(), bucket, uploadfile.getOriginalFilename());
}
return Response.OK();
}
@GetMapping(value = "/listBuckets")
@MyLog(value = "列出所有的桶",name = "查询")
public String listBuckets() throws Exception {
return Response.OK(minioUtil.listBuckets());
}
@GetMapping(value = "/listFiles")
@MyLog(value = "递归列出一个桶中所有的文件和目录",name = "查询")
public String listFiles(@RequestParam String bucket) throws Exception {
return Response.OK(minioUtil.listFiles(bucket));
}
@GetMapping(value = "/downloadFile")
@MyLog(value = "下载一个文件",name = "下载")
public void downloadFile(@RequestParam String bucket, @RequestParam String objectName,
HttpServletResponse response) throws Exception {
InputStream stream = minioUtil.download(bucket, objectName);
ServletOutputStream output = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
IOUtils.copy(stream, output);
}
@GetMapping(value = "/deleteFile")
@MyLog(value = "删除一个文件",name = "删除")
public String deleteFile(@RequestParam String bucket, @RequestParam String objectName) throws Exception {
minioUtil.deleteObject(bucket, objectName);
return Response.OK();
}
@GetMapping(value = "/deleteBucket")
@MyLog(value = "删除一个桶",name = "删除")
public String deleteBucket(@RequestParam String bucket) throws Exception {
minioUtil.deleteBucket(bucket);
return Response.OK();
}
@GetMapping("/copyObject")
@MyLog(value = "复制一个文件",name = "复制")
public String copyObject(@RequestParam String sourceBucket, @RequestParam String sourceObject, @RequestParam String targetBucket, @RequestParam String targetObject) throws Exception {
minioUtil.copyObject(sourceBucket, sourceObject, targetBucket, targetObject);
return Response.OK();
}
@GetMapping("/getObjectInfo")
@MyLog(value = "获取文件信息",name = "查询")
public String getObjectInfo(@RequestParam String bucket, @RequestParam String objectName) throws Exception {
return Response.OK(minioUtil.getObjectInfo(bucket, objectName));
}
@GetMapping("/getPresignedObjectUrl")
@MyLog(value = "获取一个下载链接",name = "查询")
public String getPresignedObjectUrl(@RequestParam String bucket, @RequestParam String objectName, @RequestParam Integer expires) throws Exception {
return Response.OK(minioUtil.getPresignedObjectUrl(bucket, objectName, expires));
}
@GetMapping("/listAllFile")
@MyLog(value = "获取minio中所有的文件",name = "查询")
public String listAllFile() throws Exception {
return Response.OK(minioUtil.listAllFile());
}
}
7.运行截图