minio的基本使用——java
第一步:下载minio服务安装包
去官网下载:MinIO | 用于创建高性能对象存储的代码和下载内容
minio的使用文档:MinIO Object Storage for Kubernetes — MinIO Object Storage for Kubernetes
MinIo有两个重要的对象,服务器minio.exe和客户端minio.client。搭建服务器用于接收文件信息,客户端用于上传文件。
官网下载有些慢
记住一点:如果是下载windows版本的,切记千万不能去双击运行,这样可能会导致最终启动失败;无论是windows还是linux都是通过命令启动的。
第二步:启动minio服务器
1.minio服务的启动命令
在windows环境下,在你的minio.exe文件所在位置的文件夹下(最好在同级路径下创建一个类似data的文件夹,用于存储数据),打开cmd命令框,
输入:minio.exe server D:\Java_study\javaEE-study\JAVA\minio\data (后面的数据存储路径文件夹是自定义的)
(如果是linux启动minio服务器,则在对应的minio存放的路径下输入:./minio server ./data)
2.访问minio服务器
打开浏览器输入上面的访问地址和端口即可访问minio服务器的ui界面
3.minio服务端主界面简单介绍
点开任意一个桶
4.纯java入门minio参考
-
package com.jdh.minio;
-
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.InputStream;
-
import java.util.List;
-
-
import io.minio.*;
-
import io.minio.messages.Bucket;
-
-
/**
-
* @ClassName: FileUploader
-
* @Author: jdh
-
* @CreateTime: 2022-04-15
-
* @Description: minio基本操作demo
-
*/
-
-
public class FileUploader {
-
-
public static void main(String[] args) {
-
try {
-
// 创建客户端
-
MinioClient minioClient =
-
MinioClient.builder()
-
// api地址
-
.endpoint("127.0.0.1",9000,true)
-
// .endpoint("http://127.0.0.1:9000")
-
// 前面设置的账号密码
-
.credentials("minioadmin", "minioadmin")
-
.build();
-
-
System.out.println(minioClient);
-
// 检查桶是否存在
-
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());
-
if (!found) {
-
// 创建桶
-
minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());
-
}
-
-
//列出所有桶名
-
List<Bucket> buckets = minioClient.listBuckets();
-
for (Bucket i : buckets){
-
System.out.println(i.name());
-
}
-
-
//删除某一个桶
-
// minioClient.removeBucket(
-
// RemoveBucketArgs.builder()
-
// .bucket("桶名称")
-
// .build());
-
-
-
-
System.out.println("开始你的操作");
-
-
File file = new File("D:\\Java_study\\javaEE-study\\user.xlsx");
-
-
String fileName = file.getName();
-
String realFileName = fileName.substring(fileName.lastIndexOf("\\") 1, fileName.lastIndexOf("."));
-
String fileType = fileName.substring(fileName.lastIndexOf(".") 1);
-
-
//通过路径上传一个文件
-
ObjectWriteResponse testDir = minioClient.uploadObject(
-
UploadObjectArgs.builder()
-
.bucket("test")
-
.object("user_Path1")//文件名字
-
.filename("D:\\Java_study\\javaEE-study\\user.xlsx")//文件存储的路径
-
.contentType(fileType)
-
.build());
-
-
//通过文件格式上传一个文件
-
InputStream fileInputStream = new FileInputStream(file);
-
long size = file.length();
-
-
minioClient.putObject(
-
PutObjectArgs.builder()
-
.bucket("test")
-
.object("user_File1")
-
.stream(fileInputStream, size, -1)
-
.contentType(fileType)
-
.build());
-
-
//文件下载,都是这种下载到指定路径
-
minioClient.downloadObject(DownloadObjectArgs.builder()
-
.bucket("test")
-
.object("user")
-
.filename("D:\\Java_study\\javaEE-study\\user_test.xlsx")
-
.build());
-
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
第三步:java整合minio
此demo演示的是springboot项目整合minio,demo中minio版本是8.0.3,但参考版本最低7.x以上。
demo项目gitee连接:https://gitee.com/java_utils_demo/java_minio_demo.git
1.创建一个springboot的项目
2.在pom里面引入对应的依赖
(新手别忘记引入springboot的父依赖)
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-test</artifactId>
-
</dependency>
-
<!--此依赖为minio的服务依赖-->
-
<dependency>
-
<groupId>io.minio</groupId>
-
<artifactId>minio</artifactId>
-
<version>8.0.3</version>
-
</dependency>
-
<dependency>
-
<groupId>com.alibaba.fastjson2</groupId>
-
<artifactId>fastjson2</artifactId>
-
<version>2.0.12</version>
-
</dependency>
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
</dependency>
-
</dependencies>
3.在application.yml配置文件配置
下面的配置实际可有可无,只是在创建minio的客户端的时候需要的一些连接服务端的一些相关配置信息
-
server:
-
port: 8080
-
-
minio:
-
config:
-
ip: 127.0.0.1
-
port: 9000
-
accessKey: minioadmin
-
secretKey: minioadmin
-
secure: false
-
bucketName: "jdh-bucket"
-
downloadDir: "/data/excel"
4.创建一个配置文件类
下面配置文件类就是通过spring的ConfigurationProperties注解完成配置文件中相关参数的注入
-
package com.jdh.minio.config;
-
-
import lombok.Data;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.stereotype.Component;
-
-
/**
-
* @ClassName: MinioProperties
-
* @Author: jdh
-
* @CreateTime: 2022-04-15
-
* @Description:
-
*/
-
@Component
-
@Data
-
@ConfigurationProperties(prefix = "minio.config")
-
public class MinioProperties {
-
-
/**
-
* API调用地址ip
-
*/
-
private String ip;
-
-
/**
-
* API调用地址端口
-
*/
-
private Integer port;
-
-
/**
-
* 连接账号
-
*/
-
private String accessKey;
-
-
/**
-
* 连接秘钥
-
*/
-
private String secretKey;
-
-
/**
-
* minio存储桶的名称
-
*/
-
private String bucketName;
-
-
/**
-
* 文件下载到本地的路径
-
*/
-
private String downloadDir;
-
-
/**
-
* #如果是true,则用的是https而不是http,默认值是true
-
*/
-
private Boolean secure;
-
-
}
-
5.封装一些简单的方法
如:获取一个minio连接客户端、文件上下传封装、创建\删除桶、列出所有桶\文件信息等
-
package com.jdh.minio.config;
-
-
import io.minio.*;
-
import io.minio.errors.*;
-
import io.minio.http.Method;
-
import io.minio.messages.Bucket;
-
import io.minio.messages.DeleteObject;
-
import io.minio.messages.Item;
-
import lombok.extern.slf4j.Slf4j;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.util.StringUtils;
-
import org.springframework.web.multipart.MultipartFile;
-
-
import javax.annotation.Resource;
-
import javax.servlet.http.HttpServletResponse;
-
import java.io.*;
-
import java.security.InvalidKeyException;
-
import java.security.NoSuchAlgorithmException;
-
import java.time.LocalDateTime;
-
import java.time.ZonedDateTime;
-
import java.util.List;
-
import java.util.Map;
-
import java.util.UUID;
-
import java.util.concurrent.TimeUnit;
-
-
/**
-
* @ClassName: MinioFile
-
* @Author: jdh
-
* @CreateTime: 2022-04-15
-
* @Description:
-
*/
-
@Configuration
-
@Slf4j
-
public class MinioFileUtil {
-
-
@Resource
-
private MinioProperties minioProperties;
-
-
private MinioClient minioClient;
-
-
/**
-
* 这个是6.0.左右的版本
-
* @return MinioClient
-
*/
-
// @Bean
-
// public MinioClient getMinioClient(){
-
//
-
// String url = "http:" minioProperties.getIp() ":" minioProperties.getPort();
-
//
-
// try {
-
// return new MinioClient(url, minioProperties.getAccessKey(), minioProperties.getSecretKey());
-
// } catch (InvalidEndpointException | InvalidPortException e) {
-
// e.printStackTrace();
-
// log.info("-----创建Minio客户端失败-----");
-
// return null;
-
// }
-
// }
-
-
/**
-
* 下面这个和上面的意思差不多,但是这个是新版本
-
* 获取一个连接minio服务端的客户端
-
*
-
* @return MinioClient
-
*/
-
@Bean
-
public MinioClient getClient() {
-
-
String url = "http:" minioProperties.getIp() ":" minioProperties.getPort();
-
MinioClient minioClient = MinioClient.builder()
-
.endpoint(url) //两种都可以,这种全路径的其实就是下面分开配置一样的
-
// .endpoint(minioProperties.getIp(),minioProperties.getPort(),minioProperties.getSecure())
-
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
-
.build();
-
this.minioClient = minioClient;
-
return minioClient;
-
}
-
-
/**
-
* 创建桶
-
*
-
* @param bucketName 桶名称
-
*/
-
public void createBucket(String bucketName) throws Exception {
-
if (!StringUtils.hasLength(bucketName)) {
-
throw new RuntimeException("创建桶的时候,桶名不能为空!");
-
}
-
-
// Create bucket with default region.
-
minioClient.makeBucket(MakeBucketArgs.builder()
-
.bucket(bucketName)
-
.build());
-
}
-
-
/**
-
* 创建桶,固定minio容器
-
*
-
* @param bucketName 桶名称
-
*/
-
public void createBucketByRegion(String bucketName, String region) throws Exception {
-
if (!StringUtils.hasLength(bucketName)) {
-
throw new RuntimeException("创建桶的时候,桶名不能为空!");
-
}
-
MinioClient minioClient = this.getClient();
-
-
// Create bucket with specific region.
-
minioClient.makeBucket(MakeBucketArgs.builder()
-
.bucket(bucketName)
-
.region(region) //
-
.build());
-
-
// // Create object-lock enabled bucket with specific region.
-
// minioClient.makeBucket(
-
// MakeBucketArgs.builder()
-
// .bucket("my-bucketname")
-
// .region("us-west-1")
-
// .objectLock(true)
-
// .build());
-
}
-
-
/**
-
* 修改桶名
-
* (minio不支持直接修改桶名,但是可以通过复制到一个新的桶里面,然后删除老的桶)
-
*
-
* @param oldBucketName 桶名称
-
* @param newBucketName 桶名称
-
*/
-
public void renameBucket(String oldBucketName, String newBucketName) throws Exception {
-
if (!StringUtils.hasLength(oldBucketName) || !StringUtils.hasLength(newBucketName)) {
-
throw new RuntimeException("修改桶名的时候,桶名不能为空!");
-
}
-
-
}
-
-
/**
-
* 删除桶
-
*
-
* @param bucketName 桶名称
-
*/
-
public void deleteBucket(String bucketName) throws Exception {
-
if (!StringUtils.hasLength(bucketName)) {
-
throw new RuntimeException("删除桶的时候,桶名不能为空!");
-
}
-
-
minioClient.removeBucket(
-
RemoveBucketArgs.builder()
-
.bucket(bucketName)
-
.build());
-
}
-
-
/**
-
* 检查桶是否存在
-
*
-
* @param bucketName 桶名称
-
* @return boolean true-存在 false-不存在
-
*/
-
public boolean checkBucketExist(String bucketName) throws Exception {
-
if (!StringUtils.hasLength(bucketName)) {
-
throw new RuntimeException("检测桶的时候,桶名不能为空!");
-
}
-
-
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
-
}
-
-
/**
-
* 列出所有的桶
-
*
-
* @return 所有桶名的集合
-
*/
-
public List<Bucket> getAllBucketInfo() throws Exception {
-
-
//列出所有桶
-
List<Bucket> buckets = minioClient.listBuckets();
-
return buckets;
-
}
-
-
/**
-
* 列出某个桶中的所有文件名
-
* 文件夹名为空时,则直接查询桶下面的数据,否则就查询当前桶下对于文件夹里面的数据
-
*
-
* @param bucketName 桶名称
-
* @param folderName 文件夹名
-
* @param isDeep 是否递归查询
-
*/
-
public Iterable<Result<Item>> getBucketAllFile(String bucketName, String folderName, Boolean isDeep) throws Exception {
-
if (!StringUtils.hasLength(bucketName)) {
-
throw new RuntimeException("获取桶中文件列表的时候,桶名不能为空!");
-
}
-
if (!StringUtils.hasLength(folderName)) {
-
folderName = "";
-
}
-
System.out.println(folderName);
-
Iterable<Result<Item>> listObjects = minioClient.listObjects(
-
ListObjectsArgs
-
.builder()
-
.bucket(bucketName)
-
.prefix(folderName "/")
-
.recursive(isDeep)
-
.build());
-
-
// for (Result<Item> result : listObjects) {
-
// Item item = result.get();
-
// System.out.println(item.objectName());
-
// }
-
-
return listObjects;
-
}
-
-
/**
-
* 删除文件夹
-
*
-
* @param bucketName 桶名
-
* @param objectName 文件夹名
-
* @param isDeep 是否递归删除
-
* @return
-
*/
-
public Boolean deleteBucketFile(String bucketName, String objectName) {
-
if (!StringUtils.hasLength(bucketName) || !StringUtils.hasLength(objectName)) {
-
throw new RuntimeException("删除文件的时候,桶名或文件名不能为空!");
-
}
-
try {
-
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
-
return true;
-
} catch (Exception e) {
-
log.info("删除文件失败");
-
return false;
-
}
-
}
-
-
/**
-
* 删除文件夹
-
*
-
* @param bucketName 桶名
-
* @param objectName 文件夹名
-
* @param isDeep 是否递归删除
-
* @return
-
*/
-
public Boolean deleteBucketFolder(String bucketName, String objectName, Boolean isDeep) {
-
if (!StringUtils.hasLength(bucketName) || !StringUtils.hasLength(objectName)) {
-
throw new RuntimeException("删除文件夹的时候,桶名或文件名不能为空!");
-
}
-
try {
-
ListObjectsArgs args = ListObjectsArgs.builder().bucket(bucketName).prefix(objectName "/").recursive(isDeep).build();
-
Iterable<Result<Item>> listObjects = minioClient.listObjects(args);
-
listObjects.forEach(objectResult -> {
-
try {
-
Item item = objectResult.get();
-
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(item.objectName()).build());
-
} catch (Exception e) {
-
log.info("删除文件夹中的文件异常", e);
-
}
-
});
-
return true;
-
} catch (Exception e) {
-
log.info("删除文件夹失败");
-
return false;
-
}
-
}
-
-
/**
-
* 获取文件下载地址
-
*
-
* @param bucketName 桶名
-
* @param objectName 文件名
-
* @param expires 过期时间,默认秒
-
* @return
-
* @throws Exception
-
*/
-
public String getFileDownloadUrl(String bucketName, String objectName, Integer expires) throws Exception {
-
-
GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
-
.method(Method.GET)//下载地址的请求方式
-
.bucket(bucketName)
-
.object(objectName)
-
.expiry(expires, TimeUnit.SECONDS)//下载地址过期时间
-
.build();
-
String objectUrl = minioClient.getPresignedObjectUrl(args);
-
return objectUrl;
-
}
-
-
/**
-
* 获取文件上传地址(暂时还未实现)
-
*
-
* @param bucketName 桶名
-
* @param objectName 文件名
-
* @param expires 过期时间,默认秒
-
* @return
-
* @throws Exception
-
*/
-
public String getFileUploadUrl(String bucketName, String objectName, Integer expires) throws Exception {
-
-
// 过期时间
-
ZonedDateTime zonedDateTime = ZonedDateTime.now().plusSeconds(60);
-
PostPolicy postPolicy = new PostPolicy(bucketName, zonedDateTime);
-
-
// 获取对象的默认权限策略
-
StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
-
String objectPolicy = statObjectResponse.headers().get("x-amz-object-policy");
-
-
String presignedObjectUrl = minioClient.getPresignedObjectUrl(
-
GetPresignedObjectUrlArgs.builder()
-
.bucket(bucketName)
-
.object(objectName)
-
.method(Method.POST)
-
.expiry(expires) // 预签名的 URL 有效期为 1 小时
-
.build());
-
-
MyMinioClient client = new MyMinioClient(minioClient);
-
-
return presignedObjectUrl;
-
}
-
-
/**
-
* 创建文件夹
-
*
-
* @param bucketName 桶名
-
* @param folderName 文件夹名称
-
* @return
-
* @throws Exception
-
*/
-
public ObjectWriteResponse createBucketFolder(String bucketName, String folderName) throws Exception {
-
-
if (!checkBucketExist(bucketName)) {
-
throw new RuntimeException("必须在桶存在的情况下才能创建文件夹");
-
}
-
if (!StringUtils.hasLength(folderName)) {
-
throw new RuntimeException("创建的文件夹名不能为空");
-
}
-
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
-
.bucket(bucketName)
-
.object(folderName "/")
-
.stream(new ByteArrayInputStream(new byte[0]), 0, 0)
-
.build();
-
ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs);
-
-
-
return objectWriteResponse;
-
}
-
-
/**
-
* 检测某个桶内是否存在某个文件
-
*
-
* @param objectName 文件名称
-
* @param bucketName 桶名称
-
*/
-
public boolean getBucketFileExist(String objectName, String bucketName) throws Exception {
-
if (!StringUtils.hasLength(objectName) || !StringUtils.hasLength(bucketName)) {
-
throw new RuntimeException("检测文件的时候,文件名和桶名不能为空!");
-
}
-
-
try {
-
// 判断文件是否存在
-
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()) &&
-
minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()) != null;
-
return exists;
-
} catch (ErrorResponseException e) {
-
log.info("文件不存在 ! Object does not exist");
-
return false;
-
} catch (Exception e) {
-
throw new Exception(e);
-
}
-
}
-
-
/**
-
* 判断桶中是否存在文件夹
-
*
-
* @param bucketName 同名称
-
* @param objectName 文件夹名称
-
* @param isDeep 是否递归查询(暂不支持)
-
* @return
-
*/
-
public Boolean checkBucketFolderExist(String bucketName, String objectName, Boolean isDeep) {
-
-
Iterable<Result<Item>> results = minioClient.listObjects(
-
ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(isDeep).build());
-
-
return results.iterator().hasNext(); // 文件夹下存在文件
-
}
-
-
/**
-
* 根据MultipartFile file上传文件
-
* minio 采用文件流上传,可以换成下面的文件上传
-
*
-
* @param file 上传的文件
-
* @param bucketName 上传至服务器的桶名称
-
*/
-
public boolean uploadFile(MultipartFile file, String bucketName) throws Exception {
-
-
if (file == null || file.getSize() == 0 || file.isEmpty()) {
-
throw new RuntimeException("上传文件为空,请重新上传");
-
}
-
-
if (!StringUtils.hasLength(bucketName)) {
-
log.info("传入桶名为空,将设置默认桶名:" minioProperties.getBucketName());
-
bucketName = minioProperties.getBucketName();
-
if (!this.checkBucketExist(minioProperties.getBucketName())) {
-
this.createBucket(minioProperties.getBucketName());
-
}
-
}
-
-
if (!this.checkBucketExist(bucketName)) {
-
throw new RuntimeException("当前操作的桶不存在!");
-
}
-
-
// 获取上传的文件名
-
String filename = file.getOriginalFilename();
-
assert filename != null;
-
//可以选择生成一个minio中存储的文件名称
-
String minioFilename = UUID.randomUUID().toString() "_" filename;
-
String url = "http:" minioProperties.getIp() ":" minioProperties.getPort();
-
-
InputStream inputStream = file.getInputStream();
-
long size = file.getSize();
-
String contentType = file.getContentType();
-
-
// Upload known sized input stream.
-
minioClient.putObject(
-
PutObjectArgs.builder()
-
.bucket(bucketName) //上传到指定桶里面
-
.object(minioFilename)//文件在minio中存储的名字
-
//p1:上传的文件流;p2:上传文件总大小;p3:上传的分片大小
-
.stream(inputStream, size, -1) //上传分片文件流大小,如果分文件上传可以采用这种形式
-
.contentType(contentType) //文件的类型
-
.build());
-
-
return this.getBucketFileExist(minioFilename, bucketName);
-
}
-
-
/**
-
* 上传本地文件,根据路径上传
-
* minio 采用文件内容上传,可以换成上面的流上传
-
*
-
* @param filePath 上传本地文件路径
-
* @Param bucketName 上传至服务器的桶名称
-
*/
-
public boolean uploadPath(String filePath, String bucketName) throws Exception {
-
-
File file = new File(filePath);
-
if (!file.isFile()) {
-
throw new RuntimeException("上传文件为空,请重新上传");
-
}
-
-
if (!StringUtils.hasLength(bucketName)) {
-
log.info("传入桶名为空,将设置默认桶名:" minioProperties.getBucketName());
-
bucketName = minioProperties.getBucketName();
-
if (!this.checkBucketExist(minioProperties.getBucketName())) {
-
this.createBucket(minioProperties.getBucketName());
-
}
-
}
-
-
if (!this.checkBucketExist(bucketName)) {
-
throw new RuntimeException("当前操作的桶不存在!");
-
}
-
-
String minioFilename = UUID.randomUUID().toString() "_" file.getName();//获取文件名称
-
String fileType = minioFilename.substring(minioFilename.lastIndexOf(".") 1);
-
-
minioClient.uploadObject(
-
UploadObjectArgs.builder()
-
.bucket(bucketName)
-
.object(minioFilename)//文件存储在minio中的名字
-
.filename(filePath)//上传本地文件存储的路径
-
.contentType(fileType)//文件类型
-
.build());
-
-
return this.getBucketFileExist(minioFilename, bucketName);
-
}
-
-
/**
-
* 文件下载,通过http返回,即在浏览器下载
-
*
-
* @param response http请求的响应对象
-
* @param bucketName 下载指定服务器的桶名称
-
* @param objectName 下载的文件名称
-
*/
-
public void downloadFile(HttpServletResponse response, String bucketName, String objectName) throws Exception {
-
if (response == null || !StringUtils.hasLength(bucketName) || !StringUtils.hasLength(objectName)) {
-
throw new RuntimeException("下载文件参数不全!");
-
}
-
-
if (!this.checkBucketExist(bucketName)) {
-
throw new RuntimeException("当前操作的桶不存在!");
-
}
-
-
//获取一个下载的文件输入流操作
-
GetObjectResponse objectResponse = minioClient.getObject(
-
GetObjectArgs.builder()
-
.bucket(bucketName)
-
.object(objectName)
-
.build());
-
-
OutputStream outputStream = response.getOutputStream();
-
int len = 0;
-
byte[] buf = new byte[1024 * 8];
-
while ((len = objectResponse.read(buf)) != -1) {
-
outputStream.write(buf, 0, len);
-
}
-
if (outputStream != null) {
-
outputStream.close();
-
outputStream.flush();
-
}
-
objectResponse.close();
-
}
-
-
/**
-
* 文件下载到指定路径
-
*
-
* @param downloadPath 下载到本地路径
-
* @param bucketName 下载指定服务器的桶名称
-
* @param objectName 下载的文件名称
-
*/
-
public void downloadPath(String downloadPath, String bucketName, String objectName) throws Exception {
-
if (downloadPath.isEmpty() || !StringUtils.hasLength(bucketName) || !StringUtils.hasLength(objectName)) {
-
throw new RuntimeException("下载文件参数不全!");
-
}
-
-
if (!new File(downloadPath).isDirectory()) {
-
throw new RuntimeException("本地下载路径必须是一个文件夹或者文件路径!");
-
}
-
-
if (!this.checkBucketExist(bucketName)) {
-
throw new RuntimeException("当前操作的桶不存在!");
-
}
-
-
downloadPath = objectName;
-
-
minioClient.downloadObject(
-
DownloadObjectArgs.builder()
-
.bucket(bucketName) //指定是在哪一个桶下载
-
.object(objectName)//是minio中文件存储的名字;本地上传的文件是user.xlsx到minio中存储的是user-minio,那么这里就是user-minio
-
.filename(downloadPath)//需要下载到本地的路径,一定是带上保存的文件名;如 d:\\minio\\user.xlsx
-
.build());
-
}
-
-
}
6.对上面封装的方法进行验证
可以在controller中写http接口来进行验证,本文采用的单元测试进行验证。
-
package com.jdh.minio.config;
-
-
import io.minio.*;
-
import io.minio.messages.Bucket;
-
import io.minio.messages.Item;
-
import org.junit.jupiter.api.Test;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.boot.test.context.SpringBootTest;
-
import org.springframework.mock.web.MockMultipartFile;
-
import org.springframework.web.multipart.MultipartFile;
-
import org.springframework.web.multipart.commons.CommonsMultipartFile;
-
-
import java.io.*;
-
import java.util.List;
-
-
import static org.junit.jupiter.api.Assertions.*;
-
-
@SpringBootTest
-
class MinioFileUtilTest {
-
-
@Autowired
-
private MinioFileUtil minioFileUtil;
-
-
/**
-
* 创建一个桶
-
*/
-
@Test
-
void createBucket() throws Exception {
-
minioFileUtil.createBucket("minio-file");
-
-
/**
-
这里创建桶的命名规则在默认情况下有要求
-
用于存储 CloudTrail 日志文件的 Amazon S3 存储桶的名称必须符合非美国标准区域的命名要求。
-
Amazon S3 存储桶的命名需符合以下一个或多个规则(用句点分隔开):
-
1.存储桶名称的长度介于 3 和 63 个字符之间,并且只能包含小写字母、数字、句点和短划线。
-
2.存储桶名称中的每个标签必须以小写字母或数字开头。
-
3.存储桶名称不能包含下划线、以短划线结束、包含连续句点或在句点旁边使用短划线。
-
4.存储桶名称不能采用 IP 地址格式 (198.51.100.24)。
-
*/
-
boolean minioFile = minioFileUtil.checkBucketExist("minio-file");
-
System.out.println(minioFile);
-
}
-
-
/**
-
* 创建一个桶
-
*/
-
@Test
-
void createBucketByRegion() throws Exception {
-
minioFileUtil.createBucketByRegion("minio-file", "minio-region");
-
-
boolean minioFile = minioFileUtil.checkBucketExist("minio-file");
-
System.out.println(minioFile);
-
}
-
-
/**
-
* 删除一个桶
-
*/
-
@Test
-
void deleteBucket() throws Exception {
-
minioFileUtil.deleteBucket("minio-file");
-
-
boolean minioFile = minioFileUtil.checkBucketExist("minio-file");
-
System.out.println(minioFile);
-
}
-
-
/**
-
* 检测桶是否存在
-
*/
-
@Test
-
void checkBucketExist() throws Exception {
-
boolean test = minioFileUtil.checkBucketExist("test");
-
System.out.println(test);
-
}
-
-
/**
-
* 获取所有的桶信息
-
*/
-
@Test
-
void getAllBucketInfo() throws Exception {
-
List<Bucket> allBucketName = minioFileUtil.getAllBucketInfo();
-
allBucketName.forEach(e -> System.out.println(e.name()));
-
}
-
-
/**
-
* 获取某个桶中的全部文件
-
*/
-
@Test
-
void getBucketAllFile() throws Exception {
-
Iterable<Result<Item>> allFile = minioFileUtil.getBucketAllFile("minio-folder", "part", true);
-
-
for (Result<Item> result : allFile) {
-
Item item = result.get();
-
System.out.println(item.objectName());
-
}
-
}
-
-
/**
-
* 检测某个桶中是否存在某个文件
-
*/
-
@Test
-
void getBucketFileExist() throws Exception {
-
boolean fileExist = minioFileUtil.getBucketFileExist("8aa570f9-53f5-4cb5-a0d1-c122ef4e3f89_出师表.docx", "minio-bucket");
-
System.out.println(fileExist);
-
}
-
-
/**
-
* 删除桶中的一个文件
-
*
-
* @throws Exception
-
*/
-
@Test
-
void deleteBucketFile() throws Exception {
-
Boolean b = minioFileUtil.deleteBucketFile("minio-folder", "出师表.docx");
-
System.out.println(b);
-
}
-
-
/**
-
* 删除桶中的一个文件夹
-
*
-
* @throws Exception
-
*/
-
@Test
-
void deleteBucketFolder() throws Exception {
-
boolean b = minioFileUtil.deleteBucketFolder("minio-folder", "tempFile", true);
-
System.out.println(b);
-
}
-
-
/**
-
* 获取文件下载路径
-
*/
-
@Test
-
void getFileDownloadUrl() throws Exception {
-
String fileUrl = minioFileUtil.getFileDownloadUrl("minio-bucket", "出师表.docx", 60);
-
System.out.println(fileUrl);
-
}
-
-
/**
-
* 获取文件上传路径
-
*/
-
@Test
-
void getFileUploadUrl() throws Exception {
-
String fileUrl = minioFileUtil.getFileUploadUrl("minio-bucket", "出师表1.docx", 3600);
-
System.out.println(fileUrl);
-
}
-
-
/**
-
* 在一个桶中创建一个空文件夹
-
*
-
* @throws Exception
-
*/
-
@Test
-
void createBucketFolder() throws Exception {
-
-
String buckName = "minio-bucket";
-
-
String folderName = "part";
-
-
ObjectWriteResponse bucketFolder = minioFileUtil.createBucketFolder(buckName, folderName);
-
}
-
-
/**
-
* 在一个桶中创建一个空文件夹
-
*
-
* @throws Exception
-
*/
-
@Test
-
void checkBucketFolderExist() throws Exception {
-
Boolean tempFile = minioFileUtil.checkBucketFolderExist("minio-bucket", "down", true);
-
System.out.println(tempFile);
-
}
-
-
/**
-
* 文件上传,通过MultipartFile形式
-
*/
-
@Test
-
void uploadFile() throws Exception {
-
File file = new File("D:\\file\\出师表.docx");
-
FileInputStream fileInputStream = new FileInputStream(file);
-
String fileName = file.getName();
-
-
MockMultipartFile multipartFile = new MockMultipartFile(fileName, fileName, "docx", fileInputStream);
-
-
boolean uploadFile = minioFileUtil.uploadFile(multipartFile, "minio-folder");
-
System.out.println(uploadFile);
-
}
-
-
/**
-
* 文件上传,通过本地路径
-
*
-
* @throws Exception
-
*/
-
@Test
-
void uploadPath() throws Exception {
-
-
boolean uploadPath = minioFileUtil.uploadPath("D:\\file\\出师表.docx", "minio-bucket");
-
System.out.println(uploadPath);
-
}
-
-
/**
-
* 文件下载,通过http响应下载
-
*/
-
@Test
-
void downloadFile() {
-
//这里可以使用模拟请求来验证
-
}
-
-
/**
-
* 文件下载,通过路径直接下载到本地
-
*
-
* @throws Exception
-
*/
-
@Test
-
void downloadPath() throws Exception {
-
MinioClient client = minioFileUtil.getClient();
-
minioFileUtil.downloadPath("D:\\file\\", "minio-bucket", "8aa570f9-53f5-4cb5-a0d1-c122ef4e3f89_出师表.docx");
-
}
-
}
7.验证结果
通过访问minio的服务端界面查看功能是否验证通过
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcabef
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13