使用MinIO上传大文件老是会OOM
受到 https://blog.csdn.net/luo4105/article/details/115296654 提醒 。故此换了一种方式去解决。
MinIO版本
排除一些JAR非必要操作,根据实际情况来。我这边是SpringBoot 2.1.3.RELEASE 搭建。可能引用的其他有重复依赖。故此把MinIO重复的依赖进行了排除
<!-- mini文件存储服务 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
<exclusion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
</exclusion>
<exclusion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
Java启动 Xms Xmx 给一个很大的值
最好给的比MinIO的5G大
因此 作者给的为 8*1024 = 8192M
再次上传接近1G的文件。不会OOM了。
MinIO-8.2.1一些方法示例代码
package minio;
import io.minio.*;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
/**
* @author 小帅丶
* @className MinIOSample
* @Description MinIOSample一些案例测试代码
* @Date 2021-04-30-15:37
**/
@Slf4j
public class MinIOSample {
/** minimum allowed multipart size is 5MiB */
private static final int MIN_MULTIPART_SIZE = 5 * 1024 * 1024;
/**
* MinIO服务的URL
*/
private static String MINIO_URL = "http://192.168.8.88:9000";
/**
* MinIO服务的Access key
*/
private static String MINIO_AK = "";
/**
* MinIO服务的Secret key
*/
private static String MINIO_SK = "";
/**
* MinIO服务的存储桶
*/
private static String MINIO_BUCKET = "";
public static void main(String[] args) {
//文件名称
String file_name = System.currentTimeMillis() + ".jpg";
//文件路径
String file_path = "F://testvideo//";
// 创建MinioClient对象
MinioClient minioClient = MinioClient.builder()
.endpoint(MINIO_URL).credentials(MINIO_AK, MINIO_SK).build();
try {
InputStream inputStream = new FileInputStream(new File(file_path+file_name));
//删除文件
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(MINIO_BUCKET)
.object(file_name)
.build());
//获取某个BUCKET下所有的文件
Iterable<Result<Item>> myObjects = minioClient.listObjects(ListObjectsArgs.builder()
.bucket(MINIO_BUCKET)
.useApiVersion1(true)
.build());
for (Result<Item> result : myObjects) {
Item item = result.get();
System.out.println(item.objectName());
}
//查询文件是否存在-不存在则抛出异常
StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder()
.bucket(MINIO_BUCKET)
.object(file_name)
.build());
System.out.println("文件名称:" + statObjectResponse.object());
//查询全部Bucket
List<Bucket> buckets = minioClient.listBuckets();
buckets.forEach(bucket -> {
System.out.println(bucket.creationDate() + ", " + bucket.name());
});
//上传文件(会根据大小自动分片上传)
ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
.bucket(MINIO_BUCKET)
.object(file_name)
.stream(inputStream,
inputStream.available(),
MIN_MULTIPART_SIZE)
.build());
System.out.println("文件名称:" + objectWriteResponse.object());
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder()
.bucket(MINIO_BUCKET)
.build());
System.out.println("存储桶是否已经存在:" + isExist);
} catch (Exception e) {
log.info("错误信息-{}", e.getMessage());
}
}
}